SOF Data Model (SDM)
This page provides developer resources for the SOF Data Model (SDM). For the conceptual overview, entity model, history API summary, and transformer list, see SOF Data Model.
Download Proto and OpenAPI Specs
Download the SDM protobuf and OpenAPI source bundle:
The archive includes the SDM protobuf definitions, Buf dependency manifests, and the generated OpenAPI schema. It does not bundle third-party protobuf dependencies. Consumers should resolve those dependencies through Buf or their language-specific protobuf toolchain.
Source Files Included
| Path | Contents |
|---|---|
|
SDM public entity, query, security, shape, provenance, and service protobuf definitions. |
|
Buf module configuration listing protobuf dependencies. |
|
Locked Buf dependency versions. |
|
OpenAPI schema generated from the SDM service definitions. |
API Implementation Notes
The public service is raft.sdm.v1beta.EntityService.
It supports ConnectRPC and native gRPC on the same service path, with REST transcoding for unary methods.
Current public methods include:
-
PublishEntity -
PublishEntities -
SearchEntities -
GetEntity -
StreamEntities -
ReplayEntityHistory -
GetEntityHistory -
GetEntityAtTime -
SearchEntitiesAtTime
History APIs use recorded_at for replay and audit order, and source_updated_at from entity.provenance.updated_at for source-timeline reconstruction.
See the SDM API Reference for the rendered OpenAPI spec.
Example Queries and Searches
The examples below use REST-transcoded endpoints from spec/sdm-swagger.yaml.
Set BASE to the external API base URL for the deployment.
BASE="https://node-a.example.com"
AUTH_HEADER="Authorization: Bearer ${TOKEN}"
Search Current Entities by Domain and Affiliation
curl -sS -X POST "${BASE}/api/v1beta/sdm/entities/search" \
-H "${AUTH_HEADER}" \
-H "Content-Type: application/json" \
-d '{
"query": {
"domains": ["ENTITY_DOMAIN_GROUND"],
"affiliations": ["AFFILIATION_FRIEND"],
"labels": {
"mission": "training"
}
},
"pageSize": 50
}' | jq .
Search Current Entities in a Bounding Box
curl -sS -X POST "${BASE}/api/v1beta/sdm/entities/search" \
-H "${AUTH_HEADER}" \
-H "Content-Type: application/json" \
-d '{
"query": {
"boundingBox": {
"minLatitudeDegrees": 38.80,
"minLongitudeDegrees": -77.20,
"maxLatitudeDegrees": 39.00,
"maxLongitudeDegrees": -76.90
}
},
"pageSize": 100
}' | jq .
Replay Accepted History Records
curl -sS -X POST "${BASE}/api/v1beta/sdm/entities/history/replay" \
-H "${AUTH_HEADER}" \
-H "Content-Type: application/json" \
-d '{
"query": {
"domains": ["ENTITY_DOMAIN_AIR"]
},
"startTime": "2026-08-10T00:00:00Z",
"endTime": "2026-08-10T01:00:00Z",
"pageSize": 100
}' | jq .
Get One Entity History
ENTITY_ID="track-001"
curl -sS "${BASE}/api/v1beta/sdm/entities/${ENTITY_ID}/history?pageSize=25&ascending=true" \
-H "${AUTH_HEADER}" | jq .
Reconstruct Entity State at Source Time
ENTITY_ID="track-001"
AT_TIME="2026-08-10T00:30:00Z"
curl -sS "${BASE}/api/v1beta/sdm/entities/${ENTITY_ID}/at?atTime=${AT_TIME}" \
-H "${AUTH_HEADER}" | jq .
Search Entity Snapshots at Source Time
curl -sS -X POST "${BASE}/api/v1beta/sdm/entities/history/search-at" \
-H "${AUTH_HEADER}" \
-H "Content-Type: application/json" \
-d '{
"atTime": "2026-08-10T00:30:00Z",
"query": {
"statuses": ["ENTITY_STATUS_ACTIVE"],
"domains": ["ENTITY_DOMAIN_AIR", "ENTITY_DOMAIN_GROUND"]
},
"pageSize": 100
}' | jq .