Field Squared API Services

<back to all web services

AssetQuery

/{Workspace}/AssetQuery allows flexible querying of assets using structured filters.
Supports various operators (eq, ne, contains, in, gt, lt, exists) for precise asset searches.
Can query by core fields (type, name, created) and custom data fields (data.EID, data.FDH_ID, etc.).
Example: POST with filters for exact matches on type='FDH' and data.EID='specific-value'

The following routes are available for this service:
POST/{Workspace}/AssetQuery
import datetime
import decimal
from marshmallow.fields import *
from servicestack import *
from typing import *
from dataclasses import dataclass, field
from dataclasses_json import dataclass_json, LetterCase, Undefined, config
from enum import Enum, IntEnum


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class QueryFilter:
    field: Optional[str] = None
    operator: Optional[str] = None
    value: Optional[Object] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class SortCriteria:
    field: Optional[str] = None
    direction: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class AssetQuery:
    """
    /{Workspace}/AssetQuery allows flexible querying of assets using structured filters.Supports various operators (eq, ne, contains, in, gt, lt, exists) for precise asset searches.Can query by core fields (type, name, created) and custom data fields (data.EID, data.FDH_ID, etc.).Example: POST with filters for exact matches on type='FDH' and data.EID='specific-value'
    """

    workspace: Optional[str] = None
    filters: Optional[List[QueryFilter]] = None
    rec_start: Optional[int] = None
    rec_count: Optional[int] = None
    sort: Optional[List[SortCriteria]] = None
    suppress_geometry: Optional[bool] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class Schedule:
    workspace: Optional[str] = None
    object_id: Optional[str] = None
    version_id: Optional[str] = None
    based_on: Optional[str] = None
    start: Optional[str] = None
    end: Optional[str] = None
    time_zone: Optional[str] = None
    users: Optional[List[str]] = None
    teams: Optional[List[str]] = None
    data: Optional[Dict[str, Object]] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class DomainItem:
    workspace: Optional[str] = None
    object_id: Optional[str] = None
    version_id: Optional[str] = None
    last_updated: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class Location:
    y: float = 0.0
    x: float = 0.0


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class Geometry:
    type: Optional[str] = None
    coordinates: Optional[List[Location]] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class MaintenanceRecord:
    date_time: Optional[str] = None
    notes: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class LocationHistory:
    date: Optional[str] = None
    location: Optional[Location] = None
    barcode: Optional[str] = None
    notes: Optional[str] = None
    is_scan: bool = False


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class ClassedItem:
    object_id: Optional[str] = None
    class_: Optional[str] = field(metadata=config(field_name='class'), default=None)
    version_id: Optional[str] = None
    ancestors: Optional[List[str]] = None
    type: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class EventItem:
    object_id: Optional[str] = None
    date: Optional[str] = None
    location: Optional[Location] = None
    barcode: Optional[str] = None
    details: Optional[str] = None
    type: Optional[str] = None
    is_scan: bool = False
    user: Optional[str] = None
    selected_by: Optional[str] = None
    status: Optional[str] = None
    status_type: Optional[str] = None
    date_created: Optional[str] = None
    automatic: bool = False


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class Anno:
    x: float = 0.0
    y: float = 0.0
    r: float = 0.0
    s: float = 0.0
    t: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class AddressBasic:
    street: Optional[str] = None
    unit: Optional[str] = None
    city: Optional[str] = None
    state: Optional[str] = None
    zip: Optional[str] = None
    country: Optional[str] = None
    location: Optional[Location] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class CustomDataField:
    binding: Optional[str] = None
    label: Optional[str] = None
    value: Optional[Object] = None
    data_type: Optional[str] = None
    is_read_only: bool = False
    is_hidden: bool = False
    values: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class Asset:
    """
    Contains the data for an asset within the system.
    """

    workspace: Optional[str] = None
    time_zone: Optional[str] = None
    assigned_workspace: Optional[str] = None
    object_id: Optional[str] = None
    version_id: Optional[str] = None
    based_on: Optional[str] = None
    external_id: Optional[str] = None
    created: Optional[str] = None
    last_updated: Optional[str] = None
    name: Optional[str] = None
    schedules: Optional[List[Schedule]] = None
    documents: Optional[List[DomainItem]] = None
    tasks: Optional[List[DomainItem]] = None
    task_series: Optional[List[str]] = None
    task_series_templates: Optional[List[str]] = None
    users: Optional[List[DomainItem]] = None
    type: Optional[str] = None
    symbol: Optional[str] = None
    data: Optional[Dict[str, str]] = None
    geometry: Optional[Geometry] = None
    maintenance_history: Optional[List[MaintenanceRecord]] = None
    parent: Optional[str] = None
    ancestors: Optional[List[str]] = None
    location_history: Optional[List[LocationHistory]] = None
    owner: Optional[ClassedItem] = None
    is_parent: bool = False
    assets: Optional[List[str]] = None
    contacts: Optional[List[str]] = None
    geometry_string: Optional[str] = None
    source_projection: Optional[str] = None
    events: Optional[List[EventItem]] = None
    anno: Optional[Anno] = None
    teams: Optional[List[str]] = None
    address: Optional[AddressBasic] = None
    created_by: Optional[str] = None
    inventory_items: Optional[List[str]] = None
    active_labor_types: Optional[Dict[str, Object]] = None
    levels: int = 0
    all_assests: int = 0
    barcode: Optional[str] = None
    custom_data_fields: Optional[List[CustomDataField]] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class AssetQueryResponse:
    assets: Optional[List[Asset]] = None
    total_count: int = 0
    rec_start: int = 0
    rec_count: int = 0

Python AssetQuery DTOs

To override the Content-type in your clients, use the HTTP Accept Header, append the .jsv suffix or ?format=jsv

HTTP + JSV

The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.

POST /{Workspace}/AssetQuery HTTP/1.1 
Host: dev.fieldsquared.com 
Accept: text/jsv
Content-Type: text/jsv
Content-Length: length

{
	Workspace: String,
	Filters: 
	[
		{
			Field: String,
			Operator: String,
			Value: {}
		}
	],
	RecStart: 0,
	RecCount: 0,
	Sort: 
	[
		{
			Field: String,
			Direction: String
		}
	],
	SuppressGeometry: False
}
HTTP/1.1 200 OK
Content-Type: text/jsv
Content-Length: length

{
	Assets: 
	[
		{
			Workspace: String,
			TimeZone: String,
			AssignedWorkspace: String,
			ObjectId: String,
			VersionId: String,
			BasedOn: String,
			ExternalId: String,
			Created: String,
			LastUpdated: String,
			Name: String,
			Schedules: 
			[
				{
					Workspace: String,
					ObjectId: String,
					VersionId: String,
					BasedOn: String,
					Start: String,
					End: String,
					TimeZone: String,
					Users: 
					[
						String
					],
					Teams: 
					[
						String
					],
					Data: 
					{
						String: {}
					}
				}
			],
			Documents: 
			[
				{
					Workspace: String,
					ObjectId: String,
					VersionId: String,
					LastUpdated: String
				}
			],
			Tasks: 
			[
				{
					Workspace: String,
					ObjectId: String,
					VersionId: String,
					LastUpdated: String
				}
			],
			TaskSeries: 
			[
				String
			],
			TaskSeriesTemplates: 
			[
				String
			],
			Users: 
			[
				{
					Workspace: String,
					ObjectId: String,
					VersionId: String,
					LastUpdated: String
				}
			],
			Type: String,
			Symbol: String,
			Data: 
			{
				String: String
			},
			Geometry: 
			{
				Type: String,
				Coordinates: 
				[
					{
						y: 0,
						x: 0
					}
				]
			},
			MaintenanceHistory: 
			[
				{
					DateTime: String,
					Notes: String
				}
			],
			Parent: String,
			Ancestors: 
			[
				String
			],
			LocationHistory: 
			[
				{
					Date: String,
					Location: 
					{
						y: 0,
						x: 0
					},
					Barcode: String,
					Notes: String,
					IsScan: False
				}
			],
			Owner: 
			{
				ObjectId: String,
				Class: String,
				VersionId: String,
				Ancestors: 
				[
					String
				],
				Type: String
			},
			IsParent: False,
			Assets: 
			[
				String
			],
			Contacts: 
			[
				String
			],
			GeometryString: String,
			SourceProjection: String,
			Events: 
			[
				{
					ObjectId: String,
					Date: String,
					Location: 
					{
						y: 0,
						x: 0
					},
					Barcode: String,
					Details: String,
					Type: String,
					IsScan: False,
					User: String,
					SelectedBy: String,
					Status: String,
					StatusType: String,
					DateCreated: String,
					Automatic: False
				}
			],
			Anno: 
			{
				X: 0,
				Y: 0,
				R: 0,
				S: 0,
				T: String
			},
			Teams: 
			[
				String
			],
			Address: 
			{
				Street: String,
				Unit: String,
				City: String,
				State: String,
				Zip: String,
				Country: String,
				Location: 
				{
					y: 0,
					x: 0
				}
			},
			CreatedBy: String,
			InventoryItems: 
			[
				String
			],
			ActiveLaborTypes: 
			{
				String: {}
			},
			Levels: 0,
			AllAssests: 0,
			Barcode: String,
			CustomDataFields: 
			[
				{
					Binding: String,
					Label: String,
					Value: {},
					DataType: String,
					IsReadOnly: False,
					IsHidden: False,
					Values: String
				}
			]
		}
	],
	TotalCount: 0,
	RecStart: 0,
	RecCount: 0
}