ImportLogs APIs request and response mapping
This guide details the request and response mapping specifications and property parity analysis for migrating from the legacy Ingestion API (CreateUnstructuredLogEntries) to the modern Chronicle API (ImportLogs).
[!IMPORTANT] The modern
ImportLogsAPI does not accept legacy Ingestion API keys or partner tokens. Callers must authenticate using standard Google Cloud IAM credentials authorized for the target instance and log type resources.
Protocol and mapping overview
| Feature | Legacy API (CreateUnstructuredLogEntries) |
Modern Chronicle API (ImportLogs) |
|---|---|---|
| HTTP method | POST |
POST |
| Permissions | Ingestion API key or legacy partner tokens | chronicle.googleapis.com/logs.import |
Request payload field-by-field parity
In the legacy API, callers sent batches of raw telemetry using UnstructuredLogEntriesUpload, supplying customer_id and log_type alongside batch-level metadata in the request body. In the modern Chronicle API, logs are ingested through ImportLogsRequest, which encodes both the instance hierarchy and target log type directly within the parent resource path and wraps the log batch inside an inline_source structure.
Legacy field (UnstructuredLogEntriesUpload) |
Modern field (ImportLogsRequest) |
Field type | Parity and migration notes |
|---|---|---|---|
customer_id |
parent (in HTTP path) |
string |
Google Cloud scoping hierarchy: In the legacy API, customer identification was passed using the customer_id body field. In the modern API, the customer instance is identified in the resource path: projects/{project}/locations/{location}/instances/{instance}/logTypes/{log_type}. |
log_type |
parent (in HTTP path) |
string |
Path-based log type binding: The log type identifying the format and parser (for example, WINEVTLOG or PAN_FIREWALL) is bound directly in the URL path as a subresource of the instance. |
| — | inline_source |
LogsInlineSource (oneof source) |
Encapsulation wrapper: The modern API encapsulates ingested telemetry inside a oneof source container. Inlined log batches are provided within inline_source. |
entries |
inline_source.logs |
repeated Log |
Parity mapped with per-log metadata: Repeated list of log entries to be ingested. The modern API converts entries into canonical Log resources with dedicated timestamps, labels, and metadata. |
additionals |
inline_source.logs[].additionals |
google.protobuf.Struct |
Shifted to per-log scope: In the legacy API, additionals applied across the entire batch. In the modern API, supplemental structured metadata is specified per log entry in Log.additionals. |
namespace |
inline_source.logs[].environment_namespace |
string |
Shifted to per-log scope: In the legacy API, environment namespace applied across the entire batch. In the modern API, namespace tagging is configured individually per log entry in Log.environment_namespace. |
labels |
inline_source.logs[].labels |
map<string, LogLabel> |
Shifted to per-log scope with RBAC support: In the legacy API, labels were passed as a repeated list of key-value pairs at the batch level. In the modern API, labels are configured per log as a key-value map with optional Role-Based Access Control (rbac_enabled). |
| — | inline_source.forwarder |
string |
New field: Optional resource name of the Chronicle Forwarder (projects/{project}/locations/{location}/instances/{instance}/forwarders/{forwarder}) sending the import request, establishing CollectorID binding. |
| — | inline_source.source_filename |
string |
New field: Optional source filename used for out-of-band processing metadata. |
| — | hint |
string |
New field: Optional opaque hint string provided at the request root to aid parser execution. |
Log entry structure parity (UnstructuredLogEntry versus google.cloud.chronicle.v1main.Log)
The individual log structure transitions from the legacy UnstructuredLogEntry to the modern Log resource definition:
Legacy field (UnstructuredLogEntry) |
Modern field (Log) |
Field type | Parity and migration notes |
|---|---|---|---|
content.log_text / content.log_binary |
data |
bytes |
Standardized binary data: The legacy API offered a oneof content supporting either text (log_text) or binary (log_binary). The modern API unifies payload representation using bytes data (raw text logs should be sent as UTF-8 encoded bytes). |
timestamp.ts_epoch_microseconds / timestamp.ts_rfc3339 |
log_entry_time |
google.protobuf.Timestamp |
Standardized timestamp: The legacy API supported epoch microseconds or RFC 3339 string timestamps. The modern API standardizes on google.protobuf.Timestamp representing when the log event occurred. |
| — | collection_time |
google.protobuf.Timestamp |
New required field: The timestamp when the log entry was collected by the ingestion client or forwarder. Must be equal to or after log_entry_time. |
| — | name |
string |
Output only: Canonical resource name of the log (projects/{project}/locations/{location}/instances/{instance}/logTypes/{log_type}/logs/{log}). |
| — | time_zone |
string |
New field: Optional IANA time zone database name (for example, America/New_York) to calculate UTC offset when timestamps in the raw payload lack timezone context. |
(batch-level) namespace |
environment_namespace |
string |
Per-log environment namespace: User-configured data domain tag for indexing and enrichment. |
(batch-level) additionals |
additionals |
google.protobuf.Struct |
Per-log JSON metadata: Dynamic JSON structure for arbitrary custom fields. |
(batch-level) labels |
labels |
map<string, LogLabel> |
Per-log labels: Key-value map of custom labels, with each entry containing value (string) and rbac_enabled (bool). |
Response payload field-by-field parity
Both endpoints return an empty confirmation payload upon successful receipt of the log batch.
Legacy field (google.protobuf.Empty) |
Modern field (ImportLogsResponse) |
Field type | Parity and migration notes |
|---|---|---|---|
| — | — | message |
Equivalent: Both APIs return an empty JSON object ({}) upon successful validation and queuing of the log batch. |
Key differences
- Hierarchical URL path scoping (
parent):- Legacy
CreateUnstructuredLogEntriespassedcustomer_idandlog_typeas payload fields to a global endpoint (/v1/unstructuredlogentries). - Modern
ImportLogsadheres to Google Cloud Resource Manager hierarchy conventions, binding both the instance and the log type in the URL path (/v1/projects/{project}/locations/{location}/instances/{instance}/logTypes/{log_type}/logs:import).
- Legacy
- Per-log metadata scoping:
- In the legacy API,
namespace,additionals, andlabelswere defined at the batch root and applied uniformly across all entries in the batch. - In the modern API, these attributes are configured individually on each
Logresource (environment_namespace,additionals,labels), allowing diverse domains, labels, and metadata within a single batch upload.
- In the legacy API,
- Unified raw payload representation (
bytes data):- Legacy
UnstructuredLogEntryutilized aoneof contentsupporting eitherlog_text(string) orlog_binary(bytes). - Modern
Logstandardizes onbytes data. Text logs must be encoded into UTF-8 bytes prior to transmission.
- Legacy
- Granular time tracking (
log_entry_timeandcollection_time):- Modern
ImportLogsrequires explicit population ofcollection_timealongsidelog_entry_time, providing latency and collection telemetry essential for downstream pipeline ordering.
- Modern
- Forwarder and collector attribution:
- Modern
ImportLogsRequestprovides optional direct linkage to forwarder configurations usinginline_source.forwarder, ensuring accurate SecOps Collector attribution.
- Modern
- Modern IAM authorization:
- Authentication shifts from legacy Ingestion API keys and partner tokens to standard Google Cloud IAM OAuth 2.0 bearer tokens with permission check
chronicle.googleapis.com/logs.import.
- Authentication shifts from legacy Ingestion API keys and partner tokens to standard Google Cloud IAM OAuth 2.0 bearer tokens with permission check