When to Use
- Indexing new records: A new product, article, customer, or order is created in a source system and must be made searchable in Elasticsearch immediately.
- Bulk ingestion: A batch of records arrives via webhook or scheduled pull — use
Bulk: true to write them all in a single Bulk API call instead of looping.
- Event-driven log indexing: Application events, audit entries, or monitoring payloads are pushed into a time-series index for analysis in Grafana or Kibana.
- Search index population: After creating an index with explicit mappings (
index/create), populate it with initial data using this operation.
Configuration
Connection
| Field | Required | Description |
Host | Required | Elasticsearch cluster URL, e.g. https://localhost:9200 or https://my-cluster.es.io. Must include protocol. |
Username | Optional | Elasticsearch username. Required if the cluster has security enabled. |
Password | Optional | Password for the specified username. |
IgnoreSSL | Optional | Default false. Skip TLS certificate validation. Development use only — never enable in production. |
Operation — Single Mode (Bulk: false)
| Field | Required | Description |
IndexName | Required | Target index name. The index is created with dynamic mapping if it does not yet exist. |
DocumentId | Optional | Explicit document ID. If omitted, Elasticsearch auto-generates a unique ID. Use a predictable ID (e.g. the record's database PK) for idempotent writes — re-indexing the same ID replaces the document. |
Fields | Required | Document body as a JSON object. All fields are indexed according to the index mapping. |
SimplifyResponse | Optional | Default false. When true, strips Elasticsearch metadata (_shards, _seq_no) from the response, returning only documentId, version, and status. |
Operation — Bulk Mode (Bulk: true)
| Field | Required | Description |
IndexName | Required | Target index for all documents in the batch. |
Bulk | Required | Set to true to activate the Bulk API path. The Documents field is then required and Fields is ignored. |
Documents | Required | JSON array of document objects. Each element is a plain field object — do not include Bulk API action headers, the node adds those automatically. Documents are batched in groups of 50. |
Conditional visibility: The Documents field in the Atlas Form (FormID 20304) is hidden until Bulk is toggled on, via a visibilityRule expression. You will not see it unless the switch is enabled.
Validation Errors
| Error Code | Cause |
VAL_MISSING_INDEX | IndexName is empty or whitespace. |
VAL_MISSING_FIELDS | Single mode: Fields is null or empty. |
VAL_MISSING_DOCUMENTS | Bulk mode: Documents array is null or empty. |
Output
Single Mode — Success Port
| Field | Type | Description |
documentId | string | The assigned document ID — your supplied ID or the auto-generated one. |
version | string | Document version number. Starts at "1" and increments on each overwrite. |
status | string | "success" |
Bulk Mode — Success Port
| Field | Type | Description |
ProcessedCount | integer | Number of documents successfully indexed. |
FailedCount | integer | Number of documents that failed. Bulk operations partially succeed — the success port fires even if some items failed. |
FailureDetails | array | One entry per failed document: ItemIndex (position in the array), DocumentId, HttpStatusCode, ErrorType, ErrorReason. |
Bulk partial success: The success port fires even when some items in a bulk batch fail. Always check FailedCount in the downstream node and handle non-zero values — for example, log FailureDetails or route to an error notification node.
Examples
Single Document — Product Catalogue
{
"resource": "document",
"operation": "create",
"IndexName": "products",
"DocumentId": "{{ $json.sku }}",
"Fields": {
"title": "{{ $json.title }}",
"brand": "{{ $json.brand }}",
"category": "{{ $json.category }}",
"price": "{{ $json.price }}",
"tags": "{{ $json.tags }}",
"in_stock": true,
"indexed_at": "{{ $now }}"
},
"SimplifyResponse": true
}
Bulk Insert — Log Batch
{
"resource": "document",
"operation": "create",
"IndexName": "app-logs-{{ $now | date('YYYY-MM') }}",
"Bulk": true,
"Documents": "{{ $json.logEntries }}"
}
Where $json.logEntries is an array of objects, each with fields like timestamp, level, service, and message. The node batches them into groups of 50 for the Bulk API.