Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/lamassuiot/lamassuiot/llms.txt

Use this file to discover all available pages before exploring further.

The Lamassu API supports powerful server-side filtering and sorting on list endpoints, allowing you to query resources based on field values, nested JSON properties, and complex expressions.

Overview

Filtering capabilities:
  • Scalar Fields: Filter by string, number, date, and enum fields
  • JSON Fields: Use JSONPath expressions to query nested metadata
  • Array Fields: Search within arrays (tags, lists)
  • Multiple Filters: Combine multiple conditions with AND logic
  • Server-Side Processing: Efficient filtering at the database level

Basic Filtering Syntax

Query Parameter Format

GET /api/ca/v1/cas?filter=<field>[<operator>]<value>
filter
string
Filter expression in the format field[operator]value. Can be specified multiple times for AND conditions.

Example Requests

curl "https://your-instance.com/api/ca/v1/cas?filter=status[eq]=ACTIVE" \
  -H "Authorization: Bearer $TOKEN"

Filter Operators

String Operators

OperatorMeaningExampleDescription
eqEqualname[eq]=productionExact match (case-sensitive)
eq_icEqual (case-insensitive)name[eq_ic]=ProductionCase-insensitive match
neNot equalstatus[ne]=REVOKEDDoes not match
ne_icNot equal (case-insensitive)name[ne_ic]=testCase-insensitive non-match
ctContainsdescription[ct]=backupSubstring search
ct_icContains (case-insensitive)description[ct_ic]=BackupCase-insensitive substring
ncNot containsdescription[nc]=deprecatedDoes not contain substring
nc_icNot contains (case-insensitive)description[nc_ic]=DEPRECATEDCase-insensitive exclusion
Examples:
# Find CAs with "root" in the common name (case-insensitive)
GET /api/ca/v1/cas?filter=subject.common_name[ct_ic]=root

# Find devices not tagged with "test"
GET /api/devmanager/v1/devices?filter=tags[nc]=test

Date Operators

OperatorMeaningExampleDescription
bfBeforecreation_ts[bf]=2026-01-01Date before specified time
afAftervalid_from[af]=2025-01-01Date after specified time
Date Format: ISO 8601 format (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SSZ) Examples:
# Find certificates expiring before March 2026
GET /api/ca/v1/certificates?filter=valid_to[bf]=2026-03-01T00:00:00Z

# Find devices created after January 1, 2026
GET /api/devmanager/v1/devices?filter=creation_timestamp[af]=2026-01-01

Numeric Operators

OperatorMeaningExampleDescription
ltLess thanlevel[lt]=3Value less than
leLess than or equalsize[le]=2048Value less than or equal
gtGreater thanlevel[gt]=0Value greater than
geGreater than or equalsize[ge]=2048Value greater than or equal
Examples:
# Find CAs at level 2 or higher
GET /api/ca/v1/cas?filter=level[ge]=2

# Find keys smaller than 4096 bits
GET /api/kms/v1/keys?filter=size[lt]=4096

Array Operators

For array fields (like tags), use string operators:
# Find devices tagged with "production"
GET /api/devmanager/v1/devices?filter=tags[ct]=production

# Find devices with tags containing "api" (case-insensitive)
GET /api/devmanager/v1/devices?filter=tags[ct_ic]=API

JSONPath Filtering

Overview

For JSON fields (metadata, settings), use the jsonpath operator with PostgreSQL JSONPath expressions:
GET /resource?filter=<field>[jsonpath]<expression>
JSONPath filtering uses PostgreSQL’s native JSONPath implementation, providing powerful querying capabilities for nested JSON structures.

Basic JSONPath Expressions

Existence Check

# Check if metadata.environment exists
GET /api/devmanager/v1/devices?filter=metadata[jsonpath]exists($.environment)

String Equality

# Filter by metadata.environment == "production"
GET /api/devmanager/v1/devices?filter=metadata[jsonpath]$.environment%20==%20%22production%22
JSONPath expressions with spaces or special characters must be URL-encoded. Use %20 for spaces and %22 for quotes.

Numeric Comparison

# Filter by metadata.priority > 5
GET /api/devmanager/v1/devices?filter=metadata[jsonpath]$.priority%20%3E%205

Nested Properties

# Filter by nested property metadata.location.region
GET /api/devmanager/v1/devices?filter=metadata[jsonpath]$.location.region%20==%20%22us-west-1%22

Array Operations

Array Contains Value

# Check if metadata.tags array contains "production"
GET /api/devmanager/v1/devices?filter=metadata[jsonpath]exists($.tags[*]%20?%20(@%20==%20%22production%22))

Array Contains Object

# Check if array contains object with key == "production"
GET /api/devmanager/v1/devices?filter=metadata[jsonpath]exists($.tags[*]%20?%20(@.key%20==%20%22production%22))

Array Index Access

# First element equals "staging"
GET /api/devmanager/v1/devices?filter=metadata[jsonpath]$.tags[0]%20==%20%22staging%22

# Last element equals "backend"
GET /api/devmanager/v1/devices?filter=metadata[jsonpath]$.tags[last]%20==%20%22backend%22

Array Numeric Comparison

# Check if any port number > 8000
GET /api/devmanager/v1/devices?filter=metadata[jsonpath]exists($.ports[*]%20?%20(@%20%3E%208000))

Multiple Array Conditions

# Array contains both "production" AND "api"
GET /api/devmanager/v1/devices?filter=metadata[jsonpath]exists($.tags[*]%20?%20(@%20==%20%22production%22))%20%26%26%20exists($.tags[*]%20?%20(@%20==%20%22api%22))

JSONPath Syntax Reference

Type-Aware Comparisons

JSONPath comparisons respect JSON types:
  • Strings: $.name == "value"
  • Numbers: $.count > 10
  • Booleans: $.enabled == true
  • Null: $.field == null

Sorting

Basic Sorting

sort_by
string
Field name to sort by
sort_mode
string
default:"asc"
Sort order: asc (ascending) or desc (descending)
Examples:
# Sort CAs by creation time (newest first)
GET /api/ca/v1/cas?sort_by=creation_ts&sort_mode=desc

# Sort devices by status (ascending)
GET /api/devmanager/v1/devices?sort_by=status&sort_mode=asc

JSONPath Sorting

Sort by nested JSON properties using the JSONPath syntax:
GET /resource?sort_by=<field>[jsonpath]<expression>&sort_mode=asc|desc
Examples:
# Sort devices by metadata.environment (alphabetically)
GET /api/devmanager/v1/devices?sort_by=metadata[jsonpath]$.environment&sort_mode=asc

# Sort devices by metadata.priority (numeric descending)
GET /api/devmanager/v1/devices?sort_by=metadata[jsonpath]$.priority&sort_mode=desc

# Sort by nested property
GET /api/devmanager/v1/devices?sort_by=metadata[jsonpath]$.location.region&sort_mode=asc

Type-Aware Sorting

The system automatically detects JSON value types for proper sorting:
TypeBehaviorExample
StringAlphabeticaldevprodstage
NumberNumeric (not lexicographic)51020
DateChronological (ISO 8601)2025-01-102026-01-15
NULLLast (asc) or First (desc)Configurable

Combining Filters and Sorting

# Filter active devices and sort by priority
GET /api/devmanager/v1/devices?filter=status[eq]=ACTIVE&sort_by=metadata[jsonpath]$.priority&sort_mode=desc

# Filter by region and sort by environment
GET /api/devmanager/v1/devices?filter=metadata[jsonpath]$.region%20==%20%22us-west%22&sort_by=metadata[jsonpath]$.environment&sort_mode=asc

Filterable Fields by Resource

Certificate Authorities (CA)

FieldTypeOperatorsExample
idStringeq, ne, ct, ncid[eq]=root-ca
statusEnumeq, nestatus[eq]=ACTIVE
levelNumberlt, le, gt, gelevel[ge]=2
engine_idStringeq, ne, ct, ncengine_id[eq]=aws-kms
valid_fromDatebf, afvalid_from[af]=2026-01-01
valid_toDatebf, afvalid_to[bf]=2027-01-01
subject.common_nameStringeq, ne, ct, ncsubject.common_name[ct]=root
metadataJSONjsonpathmetadata[jsonpath]$.env=="prod"

Certificates

FieldTypeOperatorsExample
serial_numberStringeq, neserial_number[eq]=0A1B2C
statusEnumeq, nestatus[eq]=ACTIVE
typeEnumeq, netype[eq]=MANAGED
engine_idStringeq, neengine_id[eq]=aws-kms
valid_fromDatebf, afvalid_from[af]=2026-01-01
valid_toDatebf, afvalid_to[bf]=2026-12-31
subject.common_nameStringeq, ne, ct, ncsubject.common_name[ct]=device
metadataJSONjsonpathmetadata[jsonpath]$.purpose=="signing"

Devices

FieldTypeOperatorsExample
idStringeq, ne, ct, ncid[eq]=device-123
dms_ownerStringeq, nedms_owner[eq]=my-dms
statusEnumeq, nestatus[eq]=ACTIVE
creation_timestampDatebf, afcreation_timestamp[af]=2026-01-01
tagsArrayct, nctags[ct]=production
metadataJSONjsonpathmetadata[jsonpath]$.region=="us-west-1"

DMS Instances

FieldTypeOperatorsExample
idStringeq, ne, ct, ncid[eq]=my-dms
nameStringeq, ne, ct, ncname[ct]=production
creation_dateDatebf, afcreation_date[af]=2026-01-01
metadataJSONjsonpathmetadata[jsonpath]$.region=="eu-west"
settingsJSONjsonpathsettings[jsonpath]$.auto_enroll==true

Keys (KMS)

FieldTypeOperatorsExample
key_idStringeq, nekey_id[eq]=signing-key-1
engine_idStringeq, neengine_id[eq]=aws-kms
algorithmStringeq, ne, ctalgorithm[ct]=RSA
sizeNumberlt, le, gt, gesize[ge]=2048
statusStringeq, nestatus[eq]=ENABLED
creation_tsDatebf, afcreation_ts[af]=2026-01-01
tagsArrayct, nctags[ct]=production
metadataJSONjsonpathmetadata[jsonpath]$.purpose=="signing"

Statistics with Filtering

Statistics endpoints support filtering to compute aggregates on subsets:
# Get stats for active devices only
GET /api/devmanager/v1/stats?filter=status[eq]=ACTIVE

# Get stats for keys in specific engine
GET /api/kms/v1/stats?filter=engine_id[eq]=aws-kms-prod

# CA service supports dual filtering
GET /api/ca/v1/stats?ca_filter=engine_id[eq]=aws-kms&cert_filter=valid_from[af]=2026-01-01
The status field cannot be used as a filter on statistics endpoints for CA, Certificate, and Device resources because status distribution is always computed.

SDK Usage Examples

qp := &resources.QueryParameters{
    Filters: []resources.FilterOption{
        {
            Field:           "status",
            Value:           "ACTIVE",
            FilterOperation: resources.EnumEqual,
        },
    },
}

cas, err := caClient.GetCAs(ctx, services.GetCAsInput{
    QueryParameters: qp,
})

Best Practices

Always URL-encode filter values containing:
  • Spaces (use %20)
  • Quotes (use %22)
  • Special operators (>, <, = become %3E, %3C, %3D)
Most HTTP clients handle encoding automatically.
Start with the most selective filters first to improve query performance:
# Good: Specific filter first
?filter=status[eq]=ACTIVE&filter=metadata[jsonpath]$.env=="prod"

# Less optimal: Generic filter first
?filter=metadata[jsonpath]$.env=="prod"&filter=status[eq]=ACTIVE
  • Index frequently queried JSON fields in PostgreSQL for better performance
  • Use simple existence checks when possible: exists($.field) vs complex predicates
  • Avoid deep nesting when designing metadata schemas
Filters are preserved across pagination requests via the bookmark:
# First page
GET /api/ca/v1/cas?filter=status[eq]=ACTIVE&page_size=50

# Subsequent pages automatically maintain filter
GET /api/ca/v1/cas?bookmark=<token>

Common Use Cases

Find Expiring Certificates

# Certificates expiring in next 30 days
GET /api/ca/v1/certificates?filter=valid_to[bf]=2026-04-08T00:00:00Z&filter=status[eq]=ACTIVE

Production Environment Resources

# All production devices
GET /api/devmanager/v1/devices?filter=metadata[jsonpath]$.environment%20==%20%22production%22

High-Priority Issues

# Devices with priority > 5 in US region
GET /api/devmanager/v1/devices?\
  filter=metadata[jsonpath]$.priority%20%3E%205&\
  filter=metadata[jsonpath]$.region%20==%20%22us-west-1%22&\
  sort_by=metadata[jsonpath]$.priority&\
  sort_mode=desc

Compliance Reporting

# Count CAs by environment
GET /api/ca/v1/stats?ca_filter=metadata[jsonpath]$.environment%20==%20%22production%22

Troubleshooting

ErrorCauseSolution
field 'X' is not filterableField not in allowed listCheck filterable fields table
invalid JSONPath expressionSyntax error in JSONPathVerify JSONPath syntax and URL encoding
invalid filter expressionMalformed filter parameterUse correct field[op]value format
status field cannot be filteredStatus filter on stats endpointRemove status filter or use list endpoint

Next Steps

API Overview

Learn about base URLs and pagination

Authentication

Configure JWT and mTLS authentication

CA API

Manage certificate authorities

Device API

Device inventory operations