> This is the Markdown version of the page. For the complete Lattice Developers documentation index, fetch https://developer.anduril.com/llms.txt. Append .md to any page URL for its clean Markdown. # Entities overview > The data model, and how it powers your common operating picture An **entity** is an interoperable data structure that powers the Lattice common operational picture (COP). An entity consists of **components**. The presence or absence of components, rather than a strict type hierarchy, determines what an entity is and how it should be interacted with. Think of an entity as a bag of components that you can mix and match as needed. Entities might be incomplete at various points in time, reflecting the real-time state of the COP. Partial states are valuable for situational awareness, so your code must handle missing components robustly. > **Composition principles** > > \ > > > * **Components must not be duplicative** -- Avoid modeling the same underlying data on > two different components. > * **Components are non-hierarchical** -- The data model is composable and not an > inheritance tree. ## Entity model An entity requires the following components: **`entity_id`** `String` — required Unique string identifier. Can be a Globally Unique Identifier (GUID). --- **`is_live`** `Boolean` — required A boolean that when set to `true`, creates, or updates the entity. If set to `false`, while the entity is still live, it triggers a `DELETE` event. --- **`expiry_time`** `Datetime` — required The future time, less than 30 days, at which the entity expires. When the `expiry_time` has passed, Lattice deletes the entity. --- **`provenance.integration_name`** `string` — required The name of the integration that created this entity. --- **`aliases.name`** `string` Human-readable string that represents the name of an entity. --- For more information, see [Entities](/reference/rest/entities/publish-entity#request) in the *Lattice API Reference*. ## Entity templates Although there is no strict type hierarchy, a user interface could group entities according to its [ontology](/reference/rest/entities/publish-entity#ontology.template) component. Lattice supports the following three top-level entity shapes: #### [Asset](/guides/entities/overview#asset) #### [Track](/guides/entities/overview#track) #### [Geo-entity](/guides/entities/overview#geo-entity) ### Asset An *asset* is an entity under your control, or under the control of another operator or system. Assets may accept tasks such as search or tracking. To create an asset, add the following components in addition to the required components: **`ontology`** `Ontology` — required Add the ontology component and set [`template`](/reference/rest/entities/publish-entity#request.body.ontolog.template) to `TEMPLATE_ASSET` to render an asset in Lattice. --- **`location`** `Location` — required Add the [location](/reference/rest/entities/publish-entity#request.body.location) component and set the asset's position using its latitude and longitude details. --- **`milView`** `MilView` — required Add the [milView](/reference/rest/entities/publish-entity#request.body.milView) component and set the disposition, environment, and nationality of the asset. --- **Example entity models**: #### Submarine **`asset.json`** ```json title="asset.json" maxLines=25 { "entityId": "UNIQUE_ENTITY_ID", "description": "Asset", "ontology": { "template": "TEMPLATE_ASSET", "platform_type": "Submarine" }, "location": { "position": { "latitudeDegrees": 50.91402185768586, "longitudeDegrees": 0.79203612077257, "altitudeHaeMeters": 2994, "altitudeAglMeters": 2972.8 } }, "milView": { "disposition": "DISPOSITION_FRIENDLY", "environment": "ENVIRONMENT_SUB_SURFACE" }, "aliases": { "name": "Dive" }, "provenance": { "integrationName": "your_integration_name", "dataType": "your_data_type", "sourceUpdateTime": "2025-04-07T00:19:47.706196Z" }, "isLive": true, "createdTime": "2024-12-07T00:09:42.816877Z", "expiryTime": "2024-12-17T00:09:42.816878Z", } ``` #### Radar **`asset.json`** ```json title="asset.json" maxLines=25 { "entityId": "UNIQUE_ENTITY_ID", "description": "Asset", "ontology": { "template": "TEMPLATE_ASSET", "platform_type": "Radar" }, "location": { "position": { "latitudeDegrees": 50.91402185768586, "longitudeDegrees": 0.79203612077257 } }, "milView": { "disposition": "DISPOSITION_FRIENDLY", "environment": "ENVIRONMENT_SURFACE" }, "aliases": { "name": "Tower" }, "provenance": { "integrationName": "your_integration_name", "dataType": "your_data_type", "sourceUpdateTime": "2025-04-07T00:19:47.706196Z" }, "isLive": true, "createdTime": "2024-12-07T00:09:42.816877Z", "expiryTime": "2024-12-17T00:09:42.816878Z", } ``` #### UAV **`asset.json`** ```json title="asset.json" maxLines=25 { "entityId": "UNIQUE_ENTITY_ID", "description": "Asset", "ontology": { "template": "TEMPLATE_ASSET", "platform_type": "UAV" }, "location": { "position": { "latitudeDegrees": 50.91402185768586, "longitudeDegrees": 0.79203612077257, "altitudeHaeMeters": 2994, "altitudeAglMeters": 2972.8 } }, "milView": { "disposition": "DISPOSITION_FRIENDLY", "environment": "ENVIRONMENT_AIR" }, "aliases": { "name": "UAV" }, "provenance": { "integrationName": "your_integration_name", "dataType": "your_data_type", "sourceUpdateTime": "2025-04-07T00:19:47.706196Z" }, "isLive": true, "createdTime": "2024-12-07T00:09:42.816877Z", "expiryTime": "2024-12-17T00:09:42.816878Z" } ``` ### Track A *track* represents any entity tracked by an asset or integration connected to Lattice. Tracks are not directly under the control of friendly forces. This includes aircraft tracks from radar or sensors, signal detections, vehicles, people, or animals detected through cameras. Lattice supports the following track types: #### Track **`ontology`** — required Add the ontology component and set [`template`](/reference/rest/entities/publish-entity#request.body.ontolog.template) to `TEMPLATE_TRACK` to render a generic track. --- **`location`** — required Add the [`location`](/reference/rest/entities/publish-entity#request.body.position) component to set the latitude and longitude of the track. --- **`milView`** — required Add the [`milView`](/reference/rest/entities/publish-entity#request.body.milView) component to set the disposition, environment, and nationality of the track. --- **Example entity models**: #### Airplane **`track.json`** ```json title="track.json" maxLines=25 { "entityId": "UNIQUE_ENTITY_ID", "description": "Airplane", "ontology": { "template": "TEMPLATE_TRACK", "platform_type": "Airplane" }, "location": { "position": { "latitudeDegrees": 50.91402185768586, "longitudeDegrees": 0.79203612077257, "altitudeHaeMeters": 46.214997987295234 } }, "milView": { "disposition": "DISPOSITION_FRIENDLY", "environment": "ENVIRONMENT_AIR" }, "aliases": { "name": "Friendly Airplane" }, "provenance": { "integrationName": "your_integration_name", "dataType": "your_data_type", "sourceUpdateTime": "2025-04-07T00:19:47.706196Z" }, "isLive": true, "createdTime": "2024-12-07T00:19:46.706195Z", "expiryTime": "2024-12-07T00:24:46.706196Z" } ``` #### Bird **`track.json`** ```json title="track.json" maxLines=25 { "entityId": "UNIQUE_ENTITY_ID", "description": "Animal", "ontology": { "template": "TEMPLATE_TRACK", "platform_type": "Animal" }, "location": { "position": { "latitudeDegrees": 50.91402185768586, "longitudeDegrees": 0.79203612077257, "altitudeHaeMeters": 46.214997987295234 } }, "milView": { "disposition": "DISPOSITION_NEUTRAL", "environment": "ENVIRONMENT_AIR" }, "provenance": { "integrationName": "your_integration_name", "dataType": "your_data_type", "sourceUpdateTime": "2025-04-07T00:19:47.706196Z" }, "aliases": { "name": "Bird" }, "isLive": true, "createdTime": "2024-12-07T00:19:46.706195Z", "expiryTime": "2024-12-07T00:24:46.706196Z" } ``` #### Sensor point-of-interest (SPI) **`ontology`** — required Add the ontology component and set [`template`](/reference/rest/entities/publish-entity#request.body.ontolog.template) to `TEMPLATE_SENSOR_POINT_OF_INTEREST` to render a sensor detected at a specific location. --- **`location`** — required Add the [`location`](/reference/rest/entities/publish-entity#request.body.position) component to set the latitude and longitude of the track. --- **`milView`** — required Add the [`milView`](/reference/rest/entities/publish-entity#request.body.mil_view) component to set the disposition, environment, and nationality of the track. --- **`sensors`** Optionally, add the [`sensors`](/reference/rest/entities/publish-entity#request.body.sensors) component to identify details about the sensor type. --- **Example entity models**: #### Radar **`track.json`** ```json title="track.json" maxLines=25 { "entityId": "UNIQUE_ENTITY_ID", "description": "Sensor", "ontology": { "template": "TEMPLATE_SENSOR_POINT_OF_INTEREST", "platform_type": "Radar" }, "location": { "position": { "latitudeDegrees": 50.91402185768586, "longitudeDegrees": 0.79203612077257, "altitudeHaeMeters": 46.214997987295234 } }, "milView": { "disposition": "DISPOSITION_ASSUMED_FRIENDLY", "environment": "ENVIRONMENT_SURFACE" }, "sensors": { [ { "operationalState": "OPERATIONAL_STATE_OPERATIONAL", "sensorType": "SENSOR_TYPE_RADAR" } ] }, "provenance": { "integrationName": "Your Integration", "dataType": "Your Data Type", "sourceUpdateTime": "2025-04-07T00:19:47.706196Z" }, "aliases": { "name": "SPI" }, "isLive": true, "createdTime": "2024-12-07T00:19:46.706195Z" "expiryTime": "2024-12-07T00:24:46.706196Z" } ``` #### Signal of interest (SOI) **`ontology.template`** — required Add the ontology component and set [`template`](/reference/rest/entities/publish-entity#request.body.ontolog.template) to `TEMPLATE_SIGNAL_OF_INTEREST` to render a signal detection with characteristics such as emitter notation, frequency, or lines of bearing. --- **`milView`** — required Add the [`milView`](/reference/rest/entities/publish-entity#request.body.milView) component to set the disposition, environment, and nationality of the signal track. --- **`signal`** — required Add the [`signal`](/reference/rest/entities/publish-entity#request.body.signal) component to set the emitter notation, frequency, lines of bearing, and other details about the signal. --- **`location`** Optionally, if `signal.fixed` is set, add [location](/reference/rest/entities/publish-entity#request.body.position) and define the position of the signal track. --- **Example entity models**: #### Satellite **`track.json`** ```json title="track.json" maxLines=25 { "entityId": "UNIQUE_ENTITY_ID", "description": "Signal", "isLive": true, "createdTime": "2024-12-07T00:19:46.706195Z", "expiryTime": "2024-12-07T00:24:46.706196Z", "location": { "position": { "latitudeDegrees": 50.91402185768586, "longitudeDegrees": 0.79203612077257, "altitudeHaeMeters": 46.214997987295234 } }, "aliases": { "name": "Satellite 1" }, "milView": { "disposition": "DISPOSITION_SUSPICIOUS", "environment": "ENVIRONMENT_SPACE" }, "ontology": { "template": "TEMPLATE_SIGNAL_OF_INTEREST", "platform_type": "Satellite" }, "provenance": { "integrationName": "your_integration", "dataType": "your_data_type", "sourceUpdateTime": "2025-04-07T00:19:47.706196Z" } } ``` ### Geo-entity A *geo-entity* is a shape, region, or point of interest drawn on the map. Use geo-entities to represent any geographical areas of interest, such as airfields or a control zones, for autonomous vehicles to operate in. **`ontology.template`** — required Add the ontology component and set [`template`](/reference/rest/entities/publish-entity#request.body.ontolog.template) to `TEMPLATE_GEO` to render a geo-entity shape. --- **`geo_details`** — required Add the [`geo_details`](/reference/rest/entities/publish-entity#request.body.geoDetails) component. --- **`geo_shape`** — required Add the [`geo_shape`](/reference/rest/entities/publish-entity#request.body.geoShape) component. --- **`location`** Add the [`location`](/reference/rest/entities/publish-entity#request.body.location) component, if `geo_shape` is set to [ellipse](/reference/rest/entities/publish-entity#request.body.geoShape.ellipse). --- **Example entity models** #### Point **`geo.json`** ```json title="geo.json" maxLines=25 { "entityId": "UNIQUE_ENTITY_ID", "description": "Geo point", "isLive": true, "createdTime": "2024-12-07T00:45:15.581592Z", "noExpiry": true, "provenance": { "integrationName": "your_integration_name", "dataType": "your_data_type", "sourceUpdateTime": "2025-04-07T00:19:47.706196Z" }, "geoShape": { "point": { "position": { "latitudeDegrees": 50.91402185768586, "longitudeDegrees": 0.79203612077257, "altitudeHaeMeters": 46.214997987295234, "altitudeAglMeters": 0.5000067609670396 } } }, "geoDetails": { "type": "GEO_TYPE_GENERAL" }, "aliases": { "name": "Point" }, "ontology": { "template": "TEMPLATE_GEO" } } ``` #### Polygon **`geo.json`** ```json title="geo.json" maxLines=25 { "entityId": "UNIQUE_ENTITY_ID", "description": "Polygon 1", "isLive": true, "createdTime": "2024-12-07T00:55:43.183738Z", "expiryTime": "2024-12-07T01:00:43.183743Z", "aliases": { "name": "Polygon" }, "ontology": { "template": "TEMPLATE_GEO" }, "provenance": { "integrationName": "your_integration_name", "dataType": "your_data_type", "sourceUpdateTime": "2025-04-07T00:19:47.706196Z" }, "geoDetails": { "type": "GEO_TYPE_GENERAL" }, "geoShape": { "polygon": { "rings": [ { "positions": [ { "position": { "latitudeDegrees": 49.01611140463143, "longitudeDegrees": 1.5746513124955297 } }, { "position": { "latitudeDegrees": 49.01924140463143, "longitudeDegrees": 2.882469645828863 } }, { "position": { "latitudeDegrees": 48.4172380712981, "longitudeDegrees": 2.9189863124955298 } }, { "position": { "latitudeDegrees": 49.01611140463143, "longitudeDegrees": 1.5746513124955297 } } ] } ] } } } ``` #### Ellipse **`geo.json`** ```json title="geo.json" maxLines=25 { "entityId": "UNIQUE_ENTITY_ID", "description": "Geo ellipse", "isLive": true, "createdTime": "2024-12-07T01:06:32.834952Z", "expiryTime": "2024-12-07T01:11:32.834954Z", "aliases": { "name": "Ellipse" }, "ontology": { "template": "TEMPLATE_GEO" }, "provenance": { "integrationName": "your_integration_name", "dataType": "your_data_type", "sourceUpdateTime": "2025-04-07T00:19:47.706196Z" }, "geoDetails": { "type": "GEO_TYPE_CONTROL_AREA" }, "geoShape": { "ellipse": { "semiMajorAxisM": 20, "semiMinorAxisM": 20, "orientationD": 40 } }, "location": { "position": { "latitudeDegrees": 51.46, "longitudeDegrees": -0.16 } } } ``` #### Line **`geo.json`** ```json title="geo.json" maxLines=25 { "entityId": "UNIQUE_ENTITY_ID", "description": "Geo line", "isLive": true, "createdTime": "2024-12-07T01:08:39.079826Z", "expiryTime": "2024-12-07T01:13:39.079828Z", "provenance": { "integrationName": "your_integration_name", "dataType": "your_data_type", "sourceUpdateTime": "2025-04-07T00:19:47.706196Z" }, "geoShape": { "line": { "positions": [ { "latitudeDegrees": 47.605, "longitudeDegrees": -122.329 }, { "latitudeDegrees": 47.61, "longitudeDegrees": -122.33 } ] } }, "geoDetails": { "type": "GEO_TYPE_GENERAL" }, "aliases": { "name": "Line" }, "ontology": { "template": "TEMPLATE_GEO" } } ``` ## Entity lifecycle Entities have a well-defined lifecycle of **create**, **update**, and **delete**. On each lifecycle update, Entity Manager emits the state change event back to Lattice: #### Create When an app or integration publishes an entity, Lattice emits a state change event, setting the entity state to `CREATE`. #### Update When data in the entity changes, Lattice emits the state change as an **update** event. To optimize performance, Lattice relies on changes to `provenance.source_update_time` to trigger an update. It does *not* compare the full proto definitions to set the state change. #### Delete An entity is deleted when its `expiry_time` has lapsed, or an update is sent with the `is_live` component set to `false`. Alternatively, you can use the `noExpiry` flag to create entities that persist indefinitely. Use `noExpiry` only when the entity contains information that should be available to other tasks or integrations beyond its immediate operational context, such as long-living geographical entities. > **Persistence** > > \ > > > * If both `noExpiry` and `expiryTime` are set, Lattice ignores > `expiryTime`. > > * If a service restart occurs and an entity hasn't been > republished within the previous 5 minutes, the entity will not be restored, regardless of the > `noExpiry` setting. You should handle a delete event by removing all references to it in memory or discarding it from your user interface. ## What's next? * Learn more about the Entities API in [REST](/reference/rest/entities/publish-entity) and [gRPC](/reference/grpc/anduril-entitymanager-v-1/entity-manager-api/anduril-entitymanager-v-1-publish-entity). * Learn how to [publish entities to Lattice](/guides/entities/publish). * Check out the Lattice [sample apps](/samples/overview). > The data model, and how it powers your common operating picture