openapi: 3.0.0
info:
title: Import Service
version: ''
description: |-
The Emporix Import Service imports external master data into Emporix. A configuration groups one or more
streams; each stream extracts from a source connection, maps fields to an Emporix target type, and
upserts idempotently. Imports run asynchronously and stream per-stream progress over Server-Sent Events.
{% hint style="danger" %}
This functionality is in preview mode - some of the features may not be fully operational yet.
{% endhint %}
This reference covers the operational surface available with the `importtool.import_trigger` scope:
triggering, scheduling, monitoring, and cancelling import runs, reading configurations, streams,
schedules, runs, and imported data, and reading the import analytics that summarise them.
Administrative operations (creating and changing configurations, connections, streams, and mappings)
require the `importtool.import_manage` scope.
contact:
name: Emporix
url: https://emporix.com
email: documentation@emporix.com
tags:
- name: Configurations
description: Read import configurations.
- name: Streams
description: Read the streams of a configuration.
- name: Schedules
description: Read and set a configuration's run schedule.
- name: Runs
description: Trigger, monitor, and cancel import runs.
- name: Data
description: Read imported records.
- name: Analytics
description: Read aggregated import statistics, health, and the settings behind them.
- name: License
description: Read the tenant's import limits.
servers:
- url: 'https://api.emporix.io'
paths:
'/importtool/{tenant}/configs':
parameters:
- $ref: '#/components/parameters/trait_tenant'
get:
summary: Retrieving all import configurations
description: |-

{% hint style="danger" %}
This functionality is in preview mode - some of the features may not be fully operational yet.
{% endhint %}
Retrieves all import configurations defined for the tenant.
operationId: GET-importtool-list-configs
tags:
- Configurations
security:
- OAuth2:
- importtool.import_trigger
responses:
'200':
description: The request was successful. The configurations are returned.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/ImportConfig'
examples:
Configurations response:
$ref: '#/components/examples/ImportConfigs_Example'
'401':
$ref: '#/components/responses/Unauthorized_401'
'403':
$ref: '#/components/responses/Forbidden_403'
'500':
$ref: '#/components/responses/InternalServiceError_500'
'/importtool/{tenant}/configs/{id}':
parameters:
- $ref: '#/components/parameters/trait_tenant'
- $ref: '#/components/parameters/trait_id'
get:
summary: Retrieving an import configuration
description: |-

{% hint style="danger" %}
This functionality is in preview mode - some of the features may not be fully operational yet.
{% endhint %}
Retrieves a single import configuration by its identifier.
operationId: GET-importtool-get-config
tags:
- Configurations
security:
- OAuth2:
- importtool.import_trigger
responses:
'200':
description: The request was successful. The configuration is returned.
content:
application/json:
schema:
$ref: '#/components/schemas/ImportConfig'
examples:
Configuration response:
$ref: '#/components/examples/ImportConfig_Example'
'401':
$ref: '#/components/responses/Unauthorized_401'
'403':
$ref: '#/components/responses/Forbidden_403'
'404':
$ref: '#/components/responses/NotFound_404'
'500':
$ref: '#/components/responses/InternalServiceError_500'
'/importtool/{tenant}/configs/{configId}/streams':
parameters:
- $ref: '#/components/parameters/trait_tenant'
- $ref: '#/components/parameters/trait_configId'
get:
summary: Retrieving all streams of a configuration
description: |-

{% hint style="danger" %}
This functionality is in preview mode - some of the features may not be fully operational yet.
{% endhint %}
Retrieves the streams belonging to a configuration, ordered by sequence.
operationId: GET-importtool-list-streams
tags:
- Streams
security:
- OAuth2:
- importtool.import_trigger
responses:
'200':
description: The request was successful. The streams are returned.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/ImportStream'
examples:
Streams response:
$ref: '#/components/examples/ImportStreams_Example'
'401':
$ref: '#/components/responses/Unauthorized_401'
'403':
$ref: '#/components/responses/Forbidden_403'
'500':
$ref: '#/components/responses/InternalServiceError_500'
'/importtool/{tenant}/streams/{id}':
parameters:
- $ref: '#/components/parameters/trait_tenant'
- $ref: '#/components/parameters/trait_id'
get:
summary: Retrieving a stream
description: |-

{% hint style="danger" %}
This functionality is in preview mode - some of the features may not be fully operational yet.
{% endhint %}
Retrieves a single stream by its identifier, including its resolved target types.
operationId: GET-importtool-get-stream
tags:
- Streams
security:
- OAuth2:
- importtool.import_trigger
responses:
'200':
description: The request was successful. The stream is returned.
content:
application/json:
schema:
$ref: '#/components/schemas/ImportStream'
examples:
Stream response:
$ref: '#/components/examples/ImportStream_Example'
'401':
$ref: '#/components/responses/Unauthorized_401'
'403':
$ref: '#/components/responses/Forbidden_403'
'404':
$ref: '#/components/responses/NotFound_404'
'500':
$ref: '#/components/responses/InternalServiceError_500'
'/importtool/{tenant}/configs/{configId}/schedule':
parameters:
- $ref: '#/components/parameters/trait_tenant'
- $ref: '#/components/parameters/trait_configId'
get:
summary: Retrieving a schedule
description: |-

{% hint style="danger" %}
This functionality is in preview mode - some of the features may not be fully operational yet.
{% endhint %}
Retrieves the cron schedule for a configuration.
operationId: GET-importtool-get-schedule
tags:
- Schedules
security:
- OAuth2:
- importtool.import_trigger
responses:
'200':
description: The request was successful. The schedule is returned.
content:
application/json:
schema:
$ref: '#/components/schemas/Schedule'
examples:
Schedule response:
$ref: '#/components/examples/Schedule_Example'
'204':
description: No schedule is configured for the configuration.
'401':
$ref: '#/components/responses/Unauthorized_401'
'403':
$ref: '#/components/responses/Forbidden_403'
'500':
$ref: '#/components/responses/InternalServiceError_500'
put:
summary: Scheduling an import job
description: |-

{% hint style="danger" %}
This functionality is in preview mode - some of the features may not be fully operational yet.
{% endhint %}
Creates or updates the cron schedule (cron expression, time zone, and enabled flag) that runs a configuration automatically.
operationId: PUT-importtool-schedule-job
tags:
- Schedules
security:
- OAuth2:
- importtool.import_trigger
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/Schedule'
examples:
Every day at 02:00 Berlin time:
value:
cron: '0 0 2 * * *'
timezone: Europe/Berlin
enabled: true
responses:
'200':
description: The request was successful. The schedule has been saved.
content:
application/json:
schema:
$ref: '#/components/schemas/Schedule'
examples:
Schedule response:
$ref: '#/components/examples/Schedule_Example'
'400':
description: >-
The `cron` expression or `timezone` value is invalid. The service expects a six-field cron
expression (`second minute hour day-of-month month day-of-week`). A five-field expression
such as `0 * * * *` is rejected. The service does not store it.
content:
application/json:
schema:
$ref: '#/components/schemas/errorMessage'
'401':
$ref: '#/components/responses/Unauthorized_401'
'403':
$ref: '#/components/responses/Forbidden_403'
'404':
$ref: '#/components/responses/NotFound_404'
'500':
$ref: '#/components/responses/InternalServiceError_500'
delete:
summary: Removing a schedule
description: |-

{% hint style="danger" %}
This functionality is in preview mode - some of the features may not be fully operational yet.
{% endhint %}
Removes the schedule. The configuration then runs only when it is triggered.
The request is idempotent. Removing a schedule that does not exist also returns `204`.
Unlike creating a schedule, this request does not require the configuration to exist.
Use it to remove a schedule that remains after the configuration is deleted.
operationId: deleteSchedule
tags:
- Schedules
security:
- OAuth2:
- importtool.import_trigger
responses:
'204':
description: The schedule has been removed. The configuration now runs only when triggered.
'401':
$ref: '#/components/responses/Unauthorized_401'
'403':
$ref: '#/components/responses/Forbidden_403'
'500':
$ref: '#/components/responses/InternalServiceError_500'
'/importtool/{tenant}/configs/{configId}/stream-order':
parameters:
- $ref: '#/components/parameters/trait_tenant'
- $ref: '#/components/parameters/trait_configId'
get:
summary: Retrieving the stream run order
description: |-

{% hint style="danger" %}
This functionality is in preview mode - some of the features may not be fully operational yet.
{% endhint %}
Retrieves the order in which the configuration's streams run, and the dependencies behind that order.
Dependencies between streams decide the order. Sequence breaks ties.
Dependencies come from four sources:
* an explicit dependency on another stream
* a mapping that references a type another stream produces
* a `COMPOSITE_CHILD` stream with `childStrategy` set to `EMBED` – runs before the parent that embeds it
* a `COMPOSITE_CHILD` stream with `childStrategy` set to `PATCH`, or a `COMPOSITE_MERGE` stream – run after the parent they update
Use this endpoint rather than calculating the order yourself. Mapping transformations add
dependencies that a single stream definition does not show. An order calculated without those
dependencies can differ from the order used at run time.
operationId: GET-importtool-stream-order
tags:
- Streams
security:
- OAuth2:
- importtool.import_trigger
responses:
'200':
description: The request was successful. The stream order is returned.
content:
application/json:
schema:
type: object
properties:
order:
type: array
items:
type: string
description: Stream names in the order they run.
prereqs:
type: object
additionalProperties:
type: array
items:
type: string
description: >-
For each stream name, the streams that must run before it. A stream with no
dependencies has an empty list.
examples:
Stream order:
value:
order:
- vendor
- purchaseOrder
- purchaseOrderLine
prereqs:
vendor: []
purchaseOrder:
- vendor
purchaseOrderLine:
- purchaseOrder
'401':
$ref: '#/components/responses/Unauthorized_401'
'403':
$ref: '#/components/responses/Forbidden_403'
'500':
$ref: '#/components/responses/InternalServiceError_500'
'/importtool/{tenant}/configs/{configId}/runs':
parameters:
- $ref: '#/components/parameters/trait_tenant'
- $ref: '#/components/parameters/trait_configId'
post:
summary: Triggering an import run
description: |-

{% hint style="danger" %}
This functionality is in preview mode - some of the features may not be fully operational yet.
{% endhint %}
Starts an import run for the configuration and returns immediately with the run in a running state;
progress is streamed over Server-Sent Events. At most one run is active per configuration.
operationId: POST-importtool-trigger-run
tags:
- Runs
security:
- OAuth2:
- importtool.import_trigger
requestBody:
content:
application/json:
schema:
type: object
properties:
mode:
type: string
enum:
- FULL
- DELTA
description: The run mode. When omitted, defaults to `DELTA`.
example: DELTA
dryRun:
type: boolean
description: When `true`, the run maps and validates but performs no remote writes.
example: false
force:
type: boolean
description: >-
When `true`, every extracted record is rewritten, even if unchanged. It bypasses the idempotency `skip-if-unchanged` check. Use it to force target IDs and values to be rewritten.
example: false
sampleSize:
type: integer
minimum: 1
maximum: 100
description: >-
Dry-run only. How many mapped records to sample per stream for the preview returned as
`dryRunSample`. Clamped to 1-100; defaults to 25.
example: 25
origin:
type: string
maxLength: 40
description: >-
What requested this run. Examples: `Dashboard`, an integration scenario name, or a scheduler name.
The `trigger` field records only `MANUAL` or `SCHEDULED`. Use `origin` when more than one system
calls this endpoint. If you omit `origin` or send a blank value, the service stores the `trigger`
value. The service rejects values longer than 40 characters and values that contain control
characters. It does not shorten them.
example: Make scenario 42
streamIds:
type: array
items:
type: string
format: uuid
description: >-
The stream identifiers to run. Omit the field to run every stream in the configuration.
Send a list of stream IDs to run only those streams. Do not send stream names; use the
`id` values from the stream resource.
The service rejects an empty list. It also rejects a list that includes no stream from
this configuration. Listed streams still run in the computed stream order, not in list
order.
The service also rejects a stream that cannot produce data on its own. A `COMPOSITE_CHILD`
stream with `childStrategy` set to `EMBED` is written by its parent. A child that reads
values captured during the parent run also cannot run alone. Either stream without its
parent would complete successfully without importing records.
example:
- 8f1b6a5c-2d7e-4a91-9c33-0b5e4d2a7f10
examples:
Full run:
value:
mode: FULL
origin: Dashboard
Delta dry run:
value:
mode: DELTA
dryRun: true
Run only two streams:
value:
mode: DELTA
streamIds:
- 8f1b6a5c-2d7e-4a91-9c33-0b5e4d2a7f10
- 1c9d3e77-45ab-4f02-8e6d-77a1b0c9e254
responses:
'200':
description: The request was successful. The run has been started.
content:
application/json:
schema:
$ref: '#/components/schemas/ImportRun'
examples:
Run response:
$ref: '#/components/examples/ImportRun_Example'
'401':
$ref: '#/components/responses/Unauthorized_401'
'403':
$ref: '#/components/responses/Forbidden_403'
'409':
$ref: '#/components/responses/Conflict_409'
'500':
$ref: '#/components/responses/InternalServiceError_500'
get:
summary: Retrieving run history
description: |-

{% hint style="danger" %}
This functionality is in preview mode - some of the features may not be fully operational yet.
{% endhint %}
Retrieves the run history for a configuration, most recent first.
operationId: GET-importtool-list-runs
tags:
- Runs
parameters:
- $ref: '#/components/parameters/trait_page'
- $ref: '#/components/parameters/trait_size'
security:
- OAuth2:
- importtool.import_trigger
responses:
'200':
description: The request was successful. The run history is returned.
content:
application/json:
schema:
$ref: '#/components/schemas/ImportRunPage'
examples:
Run history response:
$ref: '#/components/examples/ImportRunPage_Example'
'401':
$ref: '#/components/responses/Unauthorized_401'
'403':
$ref: '#/components/responses/Forbidden_403'
'500':
$ref: '#/components/responses/InternalServiceError_500'
'/importtool/{tenant}/runs/{runId}':
parameters:
- $ref: '#/components/parameters/trait_tenant'
- $ref: '#/components/parameters/trait_runId'
get:
summary: Retrieving a run
description: |-

{% hint style="danger" %}
This functionality is in preview mode - some of the features may not be fully operational yet.
{% endhint %}
Retrieves a run's status together with its per-stream progress.
operationId: GET-importtool-get-run
tags:
- Runs
security:
- OAuth2:
- importtool.import_trigger
responses:
'200':
description: The request was successful. The run and its streams are returned.
content:
application/json:
schema:
$ref: '#/components/schemas/RunDetail'
examples:
Run detail response:
$ref: '#/components/examples/RunDetail_Example'
'401':
$ref: '#/components/responses/Unauthorized_401'
'403':
$ref: '#/components/responses/Forbidden_403'
'404':
$ref: '#/components/responses/NotFound_404'
'500':
$ref: '#/components/responses/InternalServiceError_500'
'/importtool/{tenant}/runs/{runId}/events':
parameters:
- $ref: '#/components/parameters/trait_tenant'
- $ref: '#/components/parameters/trait_runId'
get:
summary: Streaming run progress
description: |-

{% hint style="danger" %}
This functionality is in preview mode - some of the features may not be fully operational yet.
{% endhint %}
Streams a run's progress as Server-Sent Events: an initial `snapshot` (run and streams), then a
`stream` event per processed batch, and a final `run` event when the run finishes.
operationId: GET-importtool-stream-run-events
tags:
- Runs
security:
- OAuth2:
- importtool.import_trigger
responses:
'200':
description: The event stream was opened.
content:
text/event-stream:
schema:
type: string
example: |-
event: snapshot
data: {"run":{"id":"9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d","status":"RUNNING"},"streams":[{"streamName":"Products","status":"RUNNING","recordsRead":120}]}
event: stream
data: {"streamName":"Products","status":"RUNNING","recordsRead":240,"created":20,"updated":210,"failed":2}
event: run
data: {"id":"9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d","status":"SUCCEEDED","recordsRead":1250}
'401':
$ref: '#/components/responses/Unauthorized_401'
'403':
$ref: '#/components/responses/Forbidden_403'
'500':
$ref: '#/components/responses/InternalServiceError_500'
'/importtool/{tenant}/runs/{runId}/cancel':
parameters:
- $ref: '#/components/parameters/trait_tenant'
- $ref: '#/components/parameters/trait_runId'
post:
summary: Cancelling a run
description: |-

{% hint style="danger" %}
This functionality is in preview mode - some of the features may not be fully operational yet.
{% endhint %}
Requests cancellation of an active run. By default the cancellation is cooperative; with
`force=true` the run is stopped immediately and its configuration is unblocked.
operationId: POST-importtool-cancel-run
tags:
- Runs
parameters:
- name: force
in: query
required: false
description: When `true`, hard-stops the run immediately.
schema:
type: boolean
default: false
example: false
security:
- OAuth2:
- importtool.import_trigger
responses:
'202':
description: The cancellation was accepted.
content:
application/json:
schema:
$ref: '#/components/schemas/CancelResult'
examples:
Cancellation response:
$ref: '#/components/examples/CancelResult_Example'
'401':
$ref: '#/components/responses/Unauthorized_401'
'403':
$ref: '#/components/responses/Forbidden_403'
'409':
$ref: '#/components/responses/Conflict_409'
'500':
$ref: '#/components/responses/InternalServiceError_500'
'/importtool/{tenant}/runs/{runId}/errors':
parameters:
- $ref: '#/components/parameters/trait_tenant'
- $ref: '#/components/parameters/trait_runId'
get:
summary: Retrieving run errors
description: |-

{% hint style="danger" %}
This functionality is in preview mode - some of the features may not be fully operational yet.
{% endhint %}
Retrieves the errors recorded during a run, paginated.
operationId: GET-importtool-list-run-errors
tags:
- Runs
parameters:
- $ref: '#/components/parameters/trait_page'
- $ref: '#/components/parameters/trait_size'
security:
- OAuth2:
- importtool.import_trigger
responses:
'200':
description: The request was successful. The errors are returned.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorRecordPage'
examples:
Errors response:
$ref: '#/components/examples/ErrorRecordPage_Example'
'401':
$ref: '#/components/responses/Unauthorized_401'
'403':
$ref: '#/components/responses/Forbidden_403'
'500':
$ref: '#/components/responses/InternalServiceError_500'
'/importtool/{tenant}/data/types':
parameters:
- $ref: '#/components/parameters/trait_tenant'
get:
summary: Retrieving imported data types
description: |-

{% hint style="danger" %}
This functionality is in preview mode - some of the features may not be fully operational yet.
{% endhint %}
Retrieves the distinct target types that currently hold imported records.
operationId: GET-importtool-list-data-types
tags:
- Data
security:
- OAuth2:
- importtool.import_trigger
responses:
'200':
description: The request was successful. The types are returned.
content:
application/json:
schema:
type: array
items:
type: string
example: product
examples:
Data types response:
$ref: '#/components/examples/DataTypes_Example'
'401':
$ref: '#/components/responses/Unauthorized_401'
'403':
$ref: '#/components/responses/Forbidden_403'
'500':
$ref: '#/components/responses/InternalServiceError_500'
'/importtool/{tenant}/data/records':
parameters:
- $ref: '#/components/parameters/trait_tenant'
get:
summary: Searching imported records
description: |-

{% hint style="danger" %}
This functionality is in preview mode - some of the features may not be fully operational yet.
{% endhint %}
Searches imported records of a given type with an optional `search` filter on the natural key, paginated.
operationId: GET-importtool-search-data-records
tags:
- Data
parameters:
- name: type
in: query
required: true
description: The target type to search.
schema:
type: string
example: product
- name: search
in: query
required: false
description: >-
Optional free-text filter. This is a case-insensitive substring match on the record's
natural key only — it is NOT the Emporix query language, so field selectors and operators
(e.g. `field:value`, comparisons, boolean logic) are not supported.
schema:
type: string
default: ''
example: SKU-1001
- name: outcome
in: query
required: false
description: >-
Optional filter by import outcome. Omit to return records of all outcomes. `UPSERTED`
(created or updated), `DELETED` (removed at the source), `DELETED_TARGET` (removed in
Emporix), `FAILED`, `DRY_RUN` (produced by a dry run).
schema:
type: string
enum: [UPSERTED, DELETED, DELETED_TARGET, FAILED, DRY_RUN]
- $ref: '#/components/parameters/trait_page'
- $ref: '#/components/parameters/trait_size'
security:
- OAuth2:
- importtool.import_trigger
responses:
'200':
description: The request was successful. The records are returned.
content:
application/json:
schema:
$ref: '#/components/schemas/ImportedRecordPage'
examples:
Imported records response:
$ref: '#/components/examples/ImportedRecordPage_Example'
'401':
$ref: '#/components/responses/Unauthorized_401'
'403':
$ref: '#/components/responses/Forbidden_403'
'500':
$ref: '#/components/responses/InternalServiceError_500'
'/importtool/{tenant}/data/streams/{streamId}/records':
parameters:
- $ref: '#/components/parameters/trait_tenant'
- $ref: '#/components/parameters/trait_streamId'
get:
summary: Searching a stream's imported records
description: |-

{% hint style="danger" %}
This functionality is in preview mode - some of the features may not be fully operational yet.
{% endhint %}
Searches the imported records produced by a specific stream with an optional `search` filter on the natural key, paginated.
operationId: GET-importtool-search-stream-records
tags:
- Data
parameters:
- name: search
in: query
required: false
description: >-
Optional free-text filter. This is a case-insensitive substring match on the record's
natural key only — it is NOT the Emporix query language, so field selectors and operators
(e.g. `field:value`, comparisons, boolean logic) are not supported.
schema:
type: string
default: ''
example: SKU-1001
- name: outcome
in: query
required: false
description: >-
Optional filter by import outcome. Omit to return records of all outcomes. `UPSERTED`
(created or updated), `DELETED` (removed at the source), `DELETED_TARGET` (removed in
Emporix), `FAILED`, `DRY_RUN` (produced by a dry run).
schema:
type: string
enum: [UPSERTED, DELETED, DELETED_TARGET, FAILED, DRY_RUN]
- $ref: '#/components/parameters/trait_page'
- $ref: '#/components/parameters/trait_size'
security:
- OAuth2:
- importtool.import_trigger
responses:
'200':
description: The request was successful. The records are returned.
content:
application/json:
schema:
$ref: '#/components/schemas/ImportedRecordPage'
examples:
Stream records response:
$ref: '#/components/examples/ImportedRecordPage_Example'
'401':
$ref: '#/components/responses/Unauthorized_401'
'403':
$ref: '#/components/responses/Forbidden_403'
'500':
$ref: '#/components/responses/InternalServiceError_500'
'/importtool/{tenant}/stats':
parameters:
- $ref: '#/components/parameters/trait_tenant'
get:
summary: Retrieving import statistics
description: |-

{% hint style="danger" %}
This functionality is in preview mode - some of the features may not be fully operational yet.
{% endhint %}
Retrieves aggregated import metrics for a time window: headline counters and rates, a time series
bucketed by day, week, or month, per-stream health, the top failing streams, an error breakdown,
and how many streams were added or removed.
To narrow the scope, use:
- `configId` for one configuration
- `configIds` for several configurations
- `streamId` for one stream
When none of them are given, the whole tenant is summarised. Use `sections` to fetch only the parts
you need — an unrequested section is returned as `null`.
operationId: GET-importtool-stats
tags:
- Analytics
parameters:
- name: configId
in: query
required: false
description: Restricts the statistics to a single configuration.
schema:
type: string
format: uuid
example: 7c9e6679-7425-40de-944b-e07fc1f90ae7
- name: configIds
in: query
required: false
description: >-
Restricts the statistics to several configurations, as a comma-separated list of identifiers.
Ignored when `configId` is given.
schema:
type: string
example: '7c9e6679-7425-40de-944b-e07fc1f90ae7,550e8400-e29b-41d4-a716-446655440000'
- name: streamId
in: query
required: false
description: Restricts the statistics to a single stream. Takes precedence over the configuration filters.
schema:
type: string
format: uuid
example: 3fa85f64-5717-4562-b3fc-2c963f66afa6
- name: from
in: query
required: false
description: The start of the window, as an ISO-8601 instant. When omitted, defaults to 30 days ago.
schema:
type: string
format: date-time
example: '2024-05-01T00:00:00Z'
- name: to
in: query
required: false
description: The end of the window, as an ISO-8601 instant. Exclusive. When omitted, defaults to now.
schema:
type: string
format: date-time
example: '2024-05-31T00:00:00Z'
- name: granularity
in: query
required: false
description: The bucket size of the returned time series.
schema:
type: string
enum:
- DAY
- WEEK
- MONTH
default: DAY
example: DAY
- name: sections
in: query
required: false
description: >-
A comma-separated list of the sections to compute: `TOTALS`, `STREAMS`, `ERRORS`, `CHANGES`.
When omitted, defaults to all sections. A section not requested through the `sections` parameter
is returned as `null`.
schema:
type: string
example: 'TOTALS,ERRORS'
security:
- OAuth2:
- importtool.import_trigger
responses:
'200':
description: The request was successful. The statistics are returned.
content:
application/json:
schema:
$ref: '#/components/schemas/ImportStats'
examples:
Import statistics response:
$ref: '#/components/examples/ImportStats_Example'
'400':
description: The window or a filter value is invalid.
content:
application/json:
schema:
$ref: '#/components/schemas/errorMessage'
'401':
$ref: '#/components/responses/Unauthorized_401'
'403':
$ref: '#/components/responses/Forbidden_403'
'500':
$ref: '#/components/responses/InternalServiceError_500'
'/importtool/{tenant}/dashboard/job-groups':
parameters:
- $ref: '#/components/parameters/trait_tenant'
get:
summary: Retrieving job groups
description: |-

{% hint style="danger" %}
This functionality is in preview mode - some of the features may not be fully operational yet.
{% endhint %}
Retrieves the tenant's job groups. A job group is a named set of import configurations, used to
scope the analytics to the imports that matter to you. Groups are stored per tenant and shared by
everyone working on it.
Creating, changing, and deleting groups requires the `importtool.import_manage` scope.
operationId: GET-importtool-list-job-groups
tags:
- Analytics
security:
- OAuth2:
- importtool.import_trigger
responses:
'200':
description: The request was successful. The job groups are returned.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/JobGroup'
examples:
Job groups response:
$ref: '#/components/examples/JobGroups_Example'
'401':
$ref: '#/components/responses/Unauthorized_401'
'403':
$ref: '#/components/responses/Forbidden_403'
'500':
$ref: '#/components/responses/InternalServiceError_500'
'/importtool/{tenant}/settings/health-thresholds':
parameters:
- $ref: '#/components/parameters/trait_tenant'
get:
summary: Retrieving the tenant's health thresholds
description: |-

{% hint style="danger" %}
This functionality is in preview mode - some of the features may not be fully operational yet.
{% endhint %}
Retrieves the tenant-wide thresholds that decide whether a stream is reported as `GREEN`, `AMBER`,
or `RED` in the import statistics, together with the built-in defaults they fall back to.
Thresholds resolve field by field, from the most specific level to the least specific: stream,
configuration, tenant, then the built-in default. An unset field falls back to the value at the
next less-specific level.
Changing the tenant-wide thresholds requires the `importtool.import_manage` scope.
operationId: GET-importtool-health-thresholds
tags:
- Analytics
security:
- OAuth2:
- importtool.import_trigger
responses:
'200':
description: The request was successful. The thresholds are returned.
content:
application/json:
schema:
$ref: '#/components/schemas/HealthSettings'
examples:
Health thresholds response:
$ref: '#/components/examples/HealthSettings_Example'
'401':
$ref: '#/components/responses/Unauthorized_401'
'403':
$ref: '#/components/responses/Forbidden_403'
'500':
$ref: '#/components/responses/InternalServiceError_500'
'/importtool/{tenant}/license':
parameters:
- $ref: '#/components/parameters/trait_tenant'
get:
summary: Retrieving import limits
description: |-

{% hint style="danger" %}
This functionality is in preview mode - some of the features may not be fully operational yet.
{% endhint %}
Retrieves the tenant's import limits. If an import exceeds `maxRecordsPerEntity`, excess records
are skipped and the run finishes with the `PARTIAL` status. If `maxConcurrentImports` runs are
already active, additional run requests are rejected with a `429 Too Many Requests` response.
Contact [Emporix Support](mailto:support@emporix.com) to have a limit raised.
operationId: GET-importtool-license
tags:
- License
security:
- OAuth2:
- importtool.import_trigger
responses:
'200':
description: The request was successful. The limits are returned.
content:
application/json:
schema:
$ref: '#/components/schemas/ImportLicense'
examples:
Import license response:
$ref: '#/components/examples/ImportLicense_Example'
'401':
$ref: '#/components/responses/Unauthorized_401'
'403':
$ref: '#/components/responses/Forbidden_403'
'500':
$ref: '#/components/responses/InternalServiceError_500'
'/importtool/{tenant}/runs/{runId}/retry':
parameters:
- $ref: '#/components/parameters/trait_tenant'
- $ref: '#/components/parameters/trait_runId'
post:
summary: Retrying the failed records of a run
description: |-

{% hint style="danger" %}
This functionality is in preview mode - some of the features may not be fully operational yet.
{% endhint %}
Starts a new run that reprocesses only the records that failed in the given run, instead of the
whole source. The new run is returned immediately and reports its own progress; the original run is
left untouched and keeps its counters.
As with any run, at most one run can be active per configuration.
operationId: POST-importtool-retry-run
tags:
- Runs
security:
- OAuth2:
- importtool.import_trigger
responses:
'200':
description: The retry run was started.
content:
application/json:
schema:
$ref: '#/components/schemas/ImportRun'
examples:
Import run response:
$ref: '#/components/examples/ImportRun_Example'
'401':
$ref: '#/components/responses/Unauthorized_401'
'403':
$ref: '#/components/responses/Forbidden_403'
'404':
$ref: '#/components/responses/NotFound_404'
'409':
$ref: '#/components/responses/Conflict_409'
'500':
$ref: '#/components/responses/InternalServiceError_500'
components:
schemas:
errorMessage:
title: Error
description: Schema for specific API errors.
type: object
properties:
code:
type: integer
description: HTTP status code.
minimum: 100
maximum: 599
status:
description: HTTP status.
type: string
message:
description: Descriptive error message for debugging.
type: string
details:
description: List of problems causing this error.
type: array
items:
title: Error Detail
description: Error details.
type: string
required:
- status
- code
- message
ImportConfig:
title: Import configuration
type: object
description: An import configuration grouping one or more streams.
properties:
id:
type: string
format: uuid
description: The configuration identifier.
example: 7c9e6679-7425-40de-944b-e07fc1f90ae7
tenant:
type: string
description: The owning tenant.
example: mytenant
name:
type: string
description: The configuration name.
example: ERP product master import
description:
type: string
description: A free-text description.
example: Nightly import of product master data from the ERP system.
sourceConnId:
type: string
format: uuid
description: The default source connection for the configuration's streams.
example: 550e8400-e29b-41d4-a716-446655440000
aiEnabled:
type: boolean
description: Whether AI-assisted mapping suggestions are enabled for the configuration.
example: false
enabled:
type: boolean
description: Whether the configuration is active.
example: true
version:
type: integer
description: Incremented on every change to the configuration.
example: 3
healthThresholds:
$ref: '#/components/schemas/HealthThresholds'
createdBy:
type: string
description: The identifier of the user who created the configuration.
example: user@example.com
createdAt:
type: string
format: date-time
description: When the configuration was created.
example: '2026-07-01T10:15:30.000Z'
updatedAt:
type: string
format: date-time
description: When the configuration was last updated.
example: '2026-07-20T08:00:00.000Z'
ImportStream:
title: Stream
type: object
description: A stream that extracts from a source, maps fields, and upserts into an Emporix target type.
properties:
id:
type: string
format: uuid
description: The stream identifier.
example: 3fa85f64-5717-4562-b3fc-2c963f66afa6
configId:
type: string
format: uuid
description: The parent configuration.
example: 7c9e6679-7425-40de-944b-e07fc1f90ae7
name:
type: string
description: The stream name.
example: Products
sourceEntity:
type: string
description: The logical source entity or record.
example: PRODUCT
targetWriter:
type: string
description: The target writer code, for example `emporix.customEntity`.
example: emporix.customEntity
targetType:
type: string
description: The default target type (custom-entity type identifier).
example: product
mode:
type: string
enum:
- STANDALONE
- COMPOSITE_CHILD
- COMPOSITE_MERGE
description: How the stream contributes to the target.
example: STANDALONE
deltaField:
type: string
description: >-
The source field whose value is tracked as the delta watermark. A delta run extracts only the
records whose value is newer than the last run's.
example: LASTCHANGEDATE
deltaFieldFormat:
type: string
enum:
- DATE
- UNIX_SECONDS
- UNIX_MILLIS
description: How the delta field's values are formatted, so they can be compared correctly.
example: DATE
compositeParent:
type: string
description: For a composite child stream, the name of the stream it contributes to.
example: invoices
linkingField:
type: string
description: For a composite child stream, the source field holding its parent's key.
example: INVOICE_ID
embedAttribute:
type: string
description: For a composite child stream, the parent attribute its records are embedded into.
example: lineItems
childStrategy:
type: string
enum:
- EMBED
- PATCH
description: How a composite child's records reach the parent object.
example: EMBED
writeStrategy:
type: string
enum:
- PATCH
- MERGE_PUT
- REPLACE_PUT
description: >-
How an existing target object is updated. `PATCH` changes only the mapped fields and preserves
everything else; `REPLACE_PUT` replaces the whole object, so fields this import does not manage
are cleared.
example: PATCH
discriminatorField:
type: string
description: >-
A source field whose value routes each record to a different target type, as defined by
`discriminatorMap`.
example: DOCUMENT_TYPE
discriminatorMap:
type: object
additionalProperties:
type: string
description: Maps a discriminator value to the target type that receives those records.
example:
PO Invoice: PO_INVOICE
Non PO Invoice: NON_PO_INVOICE
targetDeleteSubscriptionEnabled:
type: boolean
description: Whether the stream reacts to its target objects being deleted outside the import.
example: false
onTargetReappear:
type: string
enum:
- IGNORE
- READD
description: What happens when a record deleted in the target is seen in the source again.
example: IGNORE
healthThresholds:
$ref: '#/components/schemas/HealthThresholds'
createdAt:
type: string
format: date-time
description: When the stream was created.
example: '2024-05-01T09:00:00.000Z'
enabled:
type: boolean
description: Whether the stream is active.
example: true
Schedule:
title: Schedule
type: object
description: A cron schedule for a configuration.
properties:
id:
type: string
format: uuid
description: The schedule identifier.
example: a3bb189e-8bf9-3888-9912-ace4e6543002
configId:
type: string
format: uuid
description: The scheduled configuration.
example: 7c9e6679-7425-40de-944b-e07fc1f90ae7
cron:
type: string
description: A Spring cron expression with six fields.
example: '0 0 2 * * *'
timezone:
type: string
description: The IANA time zone the cron is evaluated in.
example: Europe/Berlin
enabled:
type: boolean
description: Whether the schedule is active.
example: true
nextFireAt:
type: string
format: date-time
description: The next fire time.
example: '2026-07-28T00:00:00.000Z'
required:
- cron
ImportRun:
title: Run
type: object
description: An import run and its reconciled counters.
properties:
id:
type: string
format: uuid
description: The run identifier.
example: 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d
configId:
type: string
format: uuid
description: The configuration the run belongs to.
example: 7c9e6679-7425-40de-944b-e07fc1f90ae7
tenant:
type: string
description: The owning tenant.
example: mytenant
trigger:
type: string
enum:
- MANUAL
- SCHEDULED
description: What triggered the run.
example: MANUAL
dryRunSample:
type: array
description: >-
Dry-run only. A sample of the mapped records that would be written, so the mapping can be
previewed without a real import. Absent on normal runs.
items:
type: object
properties:
stream:
type: string
description: The stream that produced the sample record.
targetType:
type: string
description: The resolved target type the record would be written to.
key:
type: string
description: The record's natural/deterministic key.
fields:
type: object
additionalProperties: true
description: The mapped target fields that would be written.
origin:
type: string
description: >-
What requested the run. The `origin` value from the trigger request, or the `trigger` value when
`origin` was omitted. Use this field to distinguish a dashboard run from a run started by an
integration scenario. The field is absent on runs recorded before it existed.
example: Dashboard
status:
type: string
enum:
- QUEUED
- RUNNING
- SUCCEEDED
- PARTIAL
- FAILED
- CANCELLED
description: The run status.
example: SUCCEEDED
mode:
type: string
enum:
- FULL
- DELTA
description: The run mode.
example: DELTA
startedAt:
type: string
format: date-time
description: When the run started.
example: '2026-07-27T02:00:00.000Z'
finishedAt:
type: string
format: date-time
description: When the run finished.
example: '2026-07-27T02:04:12.000Z'
recordsRead:
type: integer
description: Records read (created + updated + skipped + deleted + failed).
example: 1250
created:
type: integer
description: Records created.
example: 40
updated:
type: integer
description: Records updated.
example: 1180
skipped:
type: integer
description: Records skipped because they were unchanged.
example: 25
failed:
type: integer
description: Records that failed.
example: 5
deleted:
type: integer
description: Records deleted.
example: 0
duplicateKeys:
type: integer
description: >-
Source rows that repeat a key already imported in this run. The import keeps the last
row of each repeated key and discards earlier rows. Duplicate keys do not fail the run;
they mean the source feed is not unique on the key the stream imports by.
example: 25907
unresolvedParents:
type: integer
description: >-
Child records that were not imported because their parent could not be found.
Counted separately from `skipped`, which counts records that were already up to date.
example: 25370
message:
type: string
description: A terminal status message, typically set on failure.
example: Import completed with 5 record failures.
retryOfRunId:
type: string
format: uuid
description: When the run retries another run's failed records, the identifier of that original run.
example: 7c9e6679-7425-40de-944b-e07fc1f90ae7
force:
type: boolean
description: Whether the run rewrote every record, bypassing the skip-if-unchanged check.
example: false
dryRun:
type: boolean
description: >-
Whether the run only extracted, mapped, and validated, writing nothing to the target. A dry run
legitimately reports zero for every counter, so this distinguishes it from a run that wrote
nothing because it failed.
example: false
cancelRequested:
type: boolean
description: Whether cancellation has been requested for a run that is still finishing.
example: false
dryRunSampleSize:
type: integer
description: For a dry run, how many mapped records were kept as a sample.
example: 10
ImportRunStream:
title: Run stream progress
type: object
description: The per-stream progress within a run.
properties:
id:
type: string
format: uuid
description: The run-stream identifier.
example: c56a4180-65aa-42ec-a945-5fd21dec0538
runId:
type: string
format: uuid
description: The run this progress belongs to.
example: 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d
streamId:
type: string
format: uuid
description: The stream this progress belongs to.
example: 3fa85f64-5717-4562-b3fc-2c963f66afa6
streamName:
type: string
description: The stream name.
example: Products
status:
type: string
enum:
- QUEUED
- RUNNING
- SUCCEEDED
- PARTIAL
- FAILED
- SKIPPED
description: The stream's status within the run.
example: PARTIAL
recordsRead:
type: integer
description: Records read for this stream.
example: 1250
created:
type: integer
description: Records created.
example: 40
updated:
type: integer
description: Records updated.
example: 1180
skipped:
type: integer
description: Records skipped.
example: 25
failed:
type: integer
description: Records that failed.
example: 5
deleted:
type: integer
description: Records deleted.
example: 0
duplicateKeys:
type: integer
description: >-
Source rows that repeat a key already imported in this run. The import keeps the last
row of each repeated key and discards earlier rows. Duplicate keys do not fail the run;
they mean the source feed is not unique on the key the stream imports by.
example: 25907
unresolvedParents:
type: integer
description: >-
Child records that were not imported because their parent could not be found.
Counted separately from `skipped`, which counts records that were already up to date.
example: 25370
message:
type: string
description: A per-stream status message.
example: 5 records failed validation.
RunDetail:
title: Run detail
type: object
description: A run together with its per-stream progress.
properties:
run:
$ref: '#/components/schemas/ImportRun'
streams:
type: array
description: The per-stream progress.
items:
$ref: '#/components/schemas/ImportRunStream'
CancelResult:
title: Cancellation result
type: object
description: The outcome of a cancellation request.
properties:
runId:
type: string
format: uuid
description: The run the cancellation targeted.
example: 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d
force:
type: boolean
description: Whether a hard stop was requested.
example: false
accepted:
type: boolean
description: Whether the cancellation was accepted. `false` when the run is unknown or already finished.
example: true
ErrorRecord:
title: Error record
type: object
description: A single error recorded during a run.
properties:
id:
type: string
format: uuid
description: The error identifier.
example: 6ba7b810-9dad-11d1-80b4-00c04fd430c8
runId:
type: string
format: uuid
description: The run the error occurred in.
example: 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d
streamId:
type: string
format: uuid
description: The stream the error occurred in.
example: 3fa85f64-5717-4562-b3fc-2c963f66afa6
naturalKey:
type: string
description: The source natural key of the offending record.
example: SKU-1001
targetEntity:
type: string
description: The target writer the record was bound for.
example: emporix.customEntity
stage:
type: string
description: The pipeline stage the error occurred in.
example: MAPPING
errorCode:
type: string
description: A machine-readable error code.
example: REQUIRED_FIELD_MISSING
message:
type: string
description: A human-readable error message.
example: Required field 'name' is missing for natural key SKU-1001.
createdAt:
type: string
format: date-time
description: When the error was recorded.
example: '2026-07-27T02:03:41.000Z'
ImportedRecord:
title: Imported record
type: object
description: A record that was imported. Holds keys and outcome; for composite parents it also holds the embedded child arrays.
properties:
id:
type: string
format: uuid
description: The imported-record identifier.
example: 1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed
configId:
type: string
format: uuid
description: The configuration the record belongs to.
example: 7c9e6679-7425-40de-944b-e07fc1f90ae7
streamId:
type: string
format: uuid
description: The stream that produced the record.
example: 3fa85f64-5717-4562-b3fc-2c963f66afa6
runId:
type: string
format: uuid
description: The run that last touched the record.
example: 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d
targetEntity:
type: string
description: The target writer code.
example: emporix.customEntity
targetType:
type: string
description: The target type.
example: product
naturalKey:
type: string
description: The source natural key.
example: SKU-1001
targetId:
type: string
description: >-
The deterministic Emporix instance ID the record was written under. It's derived from the natural
key and allows the record to be located in the target.
example: id-sku-1001
fields:
type: object
description: The stored fields.
example:
name: Pipe cutter
sku: SKU-1001
active: true
outcome:
type: string
description: The last outcome, one of `UPSERTED`, `DELETED`, `DELETED_TARGET`, `FAILED`, or `DRY_RUN`.
example: UPDATED
importedAt:
type: string
format: date-time
description: When the record was last imported.
example: '2026-07-27T02:03:55.000Z'
Page:
title: Page
type: object
description: Pagination metadata for a page of results.
properties:
totalElements:
type: integer
description: The total number of elements across all pages.
example: 1250
totalPages:
type: integer
description: The total number of pages.
example: 63
number:
type: integer
description: The current zero-based page number.
example: 0
size:
type: integer
description: The page size.
example: 20
ImportRunPage:
title: Run page
allOf:
- $ref: '#/components/schemas/Page'
- type: object
properties:
content:
type: array
description: The runs on this page.
items:
$ref: '#/components/schemas/ImportRun'
ErrorRecordPage:
title: Error record page
allOf:
- $ref: '#/components/schemas/Page'
- type: object
properties:
content:
type: array
description: The error records on this page.
items:
$ref: '#/components/schemas/ErrorRecord'
ImportedRecordPage:
title: Imported record page
allOf:
- $ref: '#/components/schemas/Page'
- type: object
properties:
content:
type: array
description: The imported records on this page.
items:
$ref: '#/components/schemas/ImportedRecord'
HealthThresholds:
title: Health thresholds
type: object
description: >-
The limits that decide whether a stream is reported as `GREEN`, `AMBER`, or `RED`. Each field is
optional and resolves independently. An unset field falls back through the hierarchy, from the most
specific level to the least specific: stream, configuration, tenant, then the built-in default.
properties:
failureRatioAmber:
type: number
format: double
description: The share of failed records (0..1) at or above which the stream is `AMBER`.
example: 0.01
failureRatioRed:
type: number
format: double
description: The share of failed records (0..1) at or above which the stream is `RED`.
example: 0.1
staleAmberHours:
type: integer
description: The age threshold, in hours, for the stream's newest data. The stream is `AMBER` when the data's age reaches or exceeds this threshold.
example: 48
staleRedHours:
type: integer
description: The age threshold, in hours, for the stream's newest data. The stream is `RED` when the data's age reaches or exceeds this threshold.
example: 168
failedRunIsRed:
type: boolean
description: Whether a failed most-recent run makes the stream `RED` regardless of the other limits.
example: true
HealthSettings:
title: Tenant health thresholds
type: object
description: The tenant-wide thresholds, together with the built-in defaults they fall back to.
properties:
thresholds:
$ref: '#/components/schemas/HealthThresholds'
builtInDefaults:
$ref: '#/components/schemas/HealthThresholds'
JobGroup:
title: Job group
type: object
description: A named set of import configurations, used to scope the import statistics.
properties:
id:
type: string
format: uuid
description: The job group identifier.
example: 9f8c7b6a-5d4e-3f2a-1b0c-9d8e7f6a5b4c
name:
type: string
description: The job group name. Unique within the tenant.
example: Nightly master data
configIds:
type: array
description: The configurations in the group.
items:
type: string
format: uuid
example: 7c9e6679-7425-40de-944b-e07fc1f90ae7
createdAt:
type: string
format: date-time
description: When the group was created.
example: '2024-05-01T09:00:00.000Z'
updatedAt:
type: string
format: date-time
description: When the group was last changed.
example: '2024-05-02T11:30:00.000Z'
ImportLicense:
title: Import limits
type: object
description: The import limits that apply to the tenant.
properties:
maxRecordsPerEntity:
type: integer
description: >-
The maximum number of records a single run may write per target type. Records beyond the limit
are skipped and the run finishes as `PARTIAL`.
example: 10000
maxConcurrentImports:
type: integer
description: >-
The maximum number of runs that may be active at once for the tenant. A run requested beyond
this limit is rejected with `429`.
example: 2
batchSize:
type: integer
description: The number of records written to the target per request.
example: 100
workers:
type: integer
description: The number of target writes performed in parallel.
example: 1
ImportStatsSummary:
title: Statistics summary
type: object
description: Headline totals for the window. Rates are fractions between 0 and 1.
properties:
totalRuns:
type: integer
description: The number of runs started in the window.
example: 42
succeeded:
type: integer
description: The number of runs that finished successfully.
example: 38
partial:
type: integer
description: The number of runs that finished with some records failing.
example: 3
failed:
type: integer
description: The number of runs that failed.
example: 1
cancelled:
type: integer
description: The number of runs that were cancelled.
example: 0
recordsRead:
type: integer
description: The number of source records read.
example: 125000
created:
type: integer
description: The number of target objects created.
example: 4300
updated:
type: integer
description: The number of target objects updated.
example: 98000
skipped:
type: integer
description: The number of records skipped because nothing had changed.
example: 22000
deleted:
type: integer
description: The number of target objects deleted.
example: 700
failedRecords:
type: integer
description: The number of records that could not be imported.
example: 130
successRate:
type: number
format: double
description: The share of runs that finished successfully.
example: 0.905
failureRate:
type: number
format: double
description: The share of records that failed.
example: 0.001
deletionRate:
type: number
format: double
description: The share of processed records that resulted in a deletion.
example: 0.006
skipRate:
type: number
format: double
description: The share of records skipped as unchanged.
example: 0.176
avgRunDurationSec:
type: number
format: double
description: The mean duration of a finished run, in seconds.
example: 184.5
avgCreatedPerRun:
type: number
format: double
description: The mean number of objects created per run.
example: 102.4
avgUpdatedPerRun:
type: number
format: double
description: The mean number of objects updated per run.
example: 2333.3
distinctEntities:
type: integer
description: The number of distinct target objects currently held by the imports in scope.
example: 87000
activeRuns:
type: integer
description: The number of runs currently in progress.
example: 1
ImportStatsPoint:
title: Statistics time bucket
type: object
description: One bucket of the time series, in UTC.
properties:
bucket:
type: string
format: date-time
description: The start of the bucket.
example: '2024-05-14T00:00:00.000Z'
runs:
type: integer
example: 3
succeeded:
type: integer
example: 3
failed:
type: integer
example: 0
recordsRead:
type: integer
example: 4200
created:
type: integer
example: 120
updated:
type: integer
example: 3900
deleted:
type: integer
example: 10
skipped:
type: integer
example: 170
failedRecords:
type: integer
example: 0
ImportStreamHealth:
title: Stream health
type: object
description: The health of one stream over the window, and the thresholds the verdict used.
properties:
streamId:
type: string
format: uuid
example: 3fa85f64-5717-4562-b3fc-2c963f66afa6
configId:
type: string
format: uuid
description: The configuration the stream belongs to.
example: 7c9e6679-7425-40de-944b-e07fc1f90ae7
name:
type: string
example: products
targetType:
type: string
description: The target type the stream writes to.
example: product
lastRunStatus:
type: string
description: The status of the stream's most recent run.
example: SUCCEEDED
lastRunAt:
type: string
format: date-time
example: '2024-05-14T02:00:00.000Z'
watermarkAgeSeconds:
type: integer
description: The number of seconds since the stream last detected new data.
example: 7200
failureRatio:
type: number
format: double
description: The share of the stream's records that failed in the window.
example: 0.002
health:
type: string
enum:
- GREEN
- AMBER
- RED
description: The stream's health verdict.
example: GREEN
thresholds:
$ref: '#/components/schemas/ImportEffectiveThresholds'
ImportEffectiveThresholds:
title: Effective thresholds
type: object
description: The threshold values the verdict was actually computed with, after resolving every level.
properties:
failureRatioAmber:
type: number
format: double
example: 0.01
failureRatioRed:
type: number
format: double
example: 0.1
staleAmberHours:
type: integer
example: 48
staleRedHours:
type: integer
example: 168
failedRunIsRed:
type: boolean
example: true
customised:
type: boolean
description: Whether any level overrides the built-in defaults.
example: false
ImportStatsNamedCount:
title: Named count
type: object
properties:
streamId:
type: string
format: uuid
example: 3fa85f64-5717-4562-b3fc-2c963f66afa6
name:
type: string
example: products
count:
type: integer
example: 87
ImportStatsErrorBucket:
title: Error bucket
type: object
description: A count of errors sharing the same stage and code.
properties:
stage:
type: string
description: The pipeline stage the error occurred in.
example: UPSERT
errorCode:
type: string
example: VALIDATION
count:
type: integer
example: 54
ImportStreamChanges:
title: Stream changes
type: object
description: The counts of streams added and removed during the time window.
properties:
added:
type: integer
example: 2
removed:
type: integer
example: 1
trackingSince:
type: string
format: date-time
description: >-
When stream tracking began for the tenant. Streams created before this point are not counted,
so a window reaching further back is not comparable.
example: '2024-03-11T08:00:00.000Z'
series:
type: array
items:
type: object
properties:
bucket:
type: string
format: date-time
example: '2024-05-14T00:00:00.000Z'
added:
type: integer
example: 1
removed:
type: integer
example: 0
ImportStats:
title: Import statistics
type: object
description: >-
Aggregated import metrics for the requested window and scope. A section that was not requested via
the `sections` parameter is returned as `null`.
properties:
summary:
$ref: '#/components/schemas/ImportStatsSummary'
series:
type: array
description: Activity per time bucket, ordered oldest first and gap-free.
items:
$ref: '#/components/schemas/ImportStatsPoint'
streamHealth:
type: array
description: The health of each stream in scope.
items:
$ref: '#/components/schemas/ImportStreamHealth'
topFailingStreams:
type: array
description: The streams with the most errors during the time window, ordered by error count in descending order.
items:
$ref: '#/components/schemas/ImportStatsNamedCount'
errorBreakdown:
type: array
description: The most common errors in the window, grouped by stage and code.
items:
$ref: '#/components/schemas/ImportStatsErrorBucket'
streamChanges:
$ref: '#/components/schemas/ImportStreamChanges'
sourceIssues:
type: array
description: >-
The source data does not match what the import process expects during the specified time window.
These issues are not failures: the runs succeed, so they do not appear in pass/fail counters.
items:
$ref: '#/components/schemas/ImportSourceIssue'
ImportSourceIssue:
type: object
properties:
streamId:
type: string
format: uuid
description: The stream the problem was observed on.
configId:
type: string
format: uuid
description: The configuration that owns the stream.
name:
type: string
description: The stream name.
example: vendor
duplicateKeys:
type: integer
description: >-
Source rows that repeat a key already imported in the same run. The import
keeps the last row of each repeated key and discards earlier rows.
example: 25907
unresolvedParents:
type: integer
description: >-
Child records that were not imported because their parent could not be found.
example: 25370
responses:
Unauthorized_401:
description: Given request is unauthorized - the authorization token is invalid or has expired. Details will be provided in the response payload.
content:
application/json:
schema:
type: object
properties:
fault:
type: object
properties:
faultstring:
type: string
detail:
type: object
properties:
errorcode:
type: string
examples:
Invalid access token:
value:
fault:
faultstring: Invalid access token
detail:
errorcode: oauth.v2.InvalidAccessToken
Access token expired:
value:
fault:
faultstring: Access Token expired
detail:
errorcode: keymanagement.service.access_token_expired
Forbidden_403:
description: Given authorization scopes are not sufficient and do not match scopes required by the endpoint.
content:
application/json:
schema:
$ref: '#/components/schemas/errorMessage'
examples:
Access to resource is forbidden:
$ref: '#/components/examples/Forbidden403_Example'
NotFound_404:
description: The requested resource does not exist.
content:
application/json:
schema:
$ref: '#/components/schemas/errorMessage'
examples:
Resource not found:
$ref: '#/components/examples/NotFound404_Example'
Conflict_409:
description: The request conflicts with the current state of the resource.
content:
application/json:
schema:
$ref: '#/components/schemas/errorMessage'
examples:
Run already active:
$ref: '#/components/examples/Conflict409_Example'
InternalServiceError_500:
description: Internal Service Error occurred.
content:
application/json:
schema:
$ref: '#/components/schemas/errorMessage'
examples:
Internal service error:
$ref: '#/components/examples/InternalServiceError500_Example'
parameters:
trait_tenant:
name: tenant
in: path
required: true
description: |
The tenant you want to access.
schema:
type: string
example: mytenant
trait_id:
name: id
in: path
required: true
description: The resource identifier.
schema:
type: string
format: uuid
example: 7c9e6679-7425-40de-944b-e07fc1f90ae7
trait_configId:
name: configId
in: path
required: true
description: The configuration identifier.
schema:
type: string
format: uuid
example: 7c9e6679-7425-40de-944b-e07fc1f90ae7
trait_streamId:
name: streamId
in: path
required: true
description: The stream identifier.
schema:
type: string
format: uuid
example: 3fa85f64-5717-4562-b3fc-2c963f66afa6
trait_runId:
name: runId
in: path
required: true
description: The run identifier.
schema:
type: string
format: uuid
example: 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d
trait_page:
name: page
in: query
required: false
description: The zero-based page number.
schema:
type: integer
default: 0
example: 0
trait_size:
name: size
in: query
required: false
description: The page size.
schema:
type: integer
example: 20
examples:
Forbidden403_Example:
value:
status: forbidden
code: 403
message: The access to the requested resource has been forbidden.
details:
- Missing required scopes
NotFound404_Example:
value:
status: element_resource_non_existing
code: 404
message: The requested resource does not exist.
Conflict409_Example:
value:
status: conflict
code: 409
message: An import run is already active for this configuration.
InternalServiceError500_Example:
value:
status: internal_service_error
code: 500
message: A server-side exception occurred that prevented the system from correctly returning the result.
details:
- 'https://pattern.yaas.io/errortypes.html'
ImportConfig_Example:
value:
id: 7c9e6679-7425-40de-944b-e07fc1f90ae7
tenant: mytenant
name: ERP product master import
description: Nightly import of product master data from the ERP system.
sourceConnId: 550e8400-e29b-41d4-a716-446655440000
aiEnabled: false
enabled: true
createdAt: '2026-07-01T10:15:30.000Z'
updatedAt: '2026-07-20T08:00:00.000Z'
ImportConfigs_Example:
value:
- id: 7c9e6679-7425-40de-944b-e07fc1f90ae7
tenant: mytenant
name: ERP product master import
description: Nightly import of product master data from the ERP system.
sourceConnId: 550e8400-e29b-41d4-a716-446655440000
aiEnabled: false
enabled: true
createdAt: '2026-07-01T10:15:30.000Z'
updatedAt: '2026-07-20T08:00:00.000Z'
ImportStream_Example:
value:
id: 3fa85f64-5717-4562-b3fc-2c963f66afa6
configId: 7c9e6679-7425-40de-944b-e07fc1f90ae7
name: Products
sourceEntity: PRODUCT
targetWriter: emporix.customEntity
targetType: product
mode: STANDALONE
enabled: true
ImportStreams_Example:
value:
- id: 3fa85f64-5717-4562-b3fc-2c963f66afa6
configId: 7c9e6679-7425-40de-944b-e07fc1f90ae7
name: Products
sourceEntity: PRODUCT
targetWriter: emporix.customEntity
targetType: product
mode: STANDALONE
enabled: true
Schedule_Example:
value:
id: a3bb189e-8bf9-3888-9912-ace4e6543002
configId: 7c9e6679-7425-40de-944b-e07fc1f90ae7
cron: '0 0 2 * * *'
timezone: Europe/Berlin
enabled: true
nextFireAt: '2026-07-28T00:00:00.000Z'
ImportRun_Example:
value:
id: 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d
configId: 7c9e6679-7425-40de-944b-e07fc1f90ae7
tenant: mytenant
trigger: MANUAL
origin: Dashboard
status: RUNNING
mode: FULL
startedAt: '2026-07-27T02:00:00.000Z'
finishedAt: null
recordsRead: 120
created: 10
updated: 100
skipped: 8
failed: 2
deleted: 0
message: null
ImportRunPage_Example:
value:
totalElements: 3
totalPages: 1
number: 0
size: 20
content:
- id: 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d
configId: 7c9e6679-7425-40de-944b-e07fc1f90ae7
tenant: mytenant
trigger: MANUAL
origin: Dashboard
status: SUCCEEDED
mode: DELTA
startedAt: '2026-07-27T02:00:00.000Z'
finishedAt: '2026-07-27T02:04:12.000Z'
recordsRead: 1250
created: 40
updated: 1180
skipped: 25
failed: 5
deleted: 0
message: Import completed with 5 record failures.
RunDetail_Example:
value:
run:
id: 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d
configId: 7c9e6679-7425-40de-944b-e07fc1f90ae7
tenant: mytenant
trigger: MANUAL
origin: Dashboard
status: SUCCEEDED
mode: DELTA
startedAt: '2026-07-27T02:00:00.000Z'
finishedAt: '2026-07-27T02:04:12.000Z'
recordsRead: 1250
created: 40
updated: 1180
skipped: 25
failed: 5
deleted: 0
message: Import completed with 5 record failures.
streams:
- id: c56a4180-65aa-42ec-a945-5fd21dec0538
runId: 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d
streamId: 3fa85f64-5717-4562-b3fc-2c963f66afa6
streamName: Products
status: PARTIAL
recordsRead: 1250
created: 40
updated: 1180
skipped: 25
failed: 5
deleted: 0
message: 5 records failed validation.
CancelResult_Example:
value:
runId: 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d
force: false
accepted: true
ErrorRecordPage_Example:
value:
totalElements: 5
totalPages: 1
number: 0
size: 50
content:
- id: 6ba7b810-9dad-11d1-80b4-00c04fd430c8
runId: 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d
streamId: 3fa85f64-5717-4562-b3fc-2c963f66afa6
naturalKey: SKU-1001
targetEntity: emporix.customEntity
stage: MAPPING
errorCode: REQUIRED_FIELD_MISSING
message: Required field 'name' is missing for natural key SKU-1001.
createdAt: '2026-07-27T02:03:41.000Z'
DataTypes_Example:
value:
- product
- category
ImportedRecordPage_Example:
value:
totalElements: 1250
totalPages: 63
number: 0
size: 20
content:
- id: 1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed
configId: 7c9e6679-7425-40de-944b-e07fc1f90ae7
streamId: 3fa85f64-5717-4562-b3fc-2c963f66afa6
runId: 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d
targetEntity: emporix.customEntity
targetType: product
naturalKey: SKU-1001
fields:
name: Pipe cutter
sku: SKU-1001
active: true
outcome: UPDATED
importedAt: '2026-07-27T02:03:55.000Z'
ImportStats_Example:
value:
summary:
totalRuns: 42
succeeded: 38
partial: 3
failed: 1
cancelled: 0
recordsRead: 125000
created: 4300
updated: 98000
skipped: 22000
deleted: 700
failedRecords: 130
successRate: 0.905
failureRate: 0.001
deletionRate: 0.006
skipRate: 0.176
avgRunDurationSec: 184.5
avgCreatedPerRun: 102.4
avgUpdatedPerRun: 2333.3
distinctEntities: 87000
activeRuns: 1
series:
- bucket: '2026-07-19T00:00:00.000Z'
runs: 3
succeeded: 3
failed: 0
recordsRead: 4200
created: 120
updated: 3900
deleted: 10
skipped: 170
failedRecords: 0
streamHealth:
- streamId: 3fa85f64-5717-4562-b3fc-2c963f66afa6
configId: 7c9e6679-7425-40de-944b-e07fc1f90ae7
name: Products
targetType: product
lastRunStatus: SUCCEEDED
lastRunAt: '2026-07-20T02:00:00.000Z'
watermarkAgeSeconds: 7200
failureRatio: 0.002
health: GREEN
thresholds:
failureRatioAmber: 0.01
failureRatioRed: 0.1
staleAmberHours: 48
staleRedHours: 168
failedRunIsRed: true
customised: false
topFailingStreams:
- streamId: 3fa85f64-5717-4562-b3fc-2c963f66afa6
name: Products
count: 87
errorBreakdown:
- stage: UPSERT
errorCode: VALIDATION
count: 54
streamChanges:
added: 2
removed: 1
trackingSince: '2026-06-11T08:00:00.000Z'
series:
- bucket: '2026-07-19T00:00:00.000Z'
added: 1
removed: 0
JobGroups_Example:
value:
- id: 9f8c7b6a-5d4e-3f2a-1b0c-9d8e7f6a5b4c
name: Nightly master data
configIds:
- 7c9e6679-7425-40de-944b-e07fc1f90ae7
createdAt: '2026-07-01T10:15:30.000Z'
updatedAt: '2026-07-20T08:00:00.000Z'
HealthSettings_Example:
value:
thresholds:
failureRatioAmber: 0.05
staleRedHours: 72
builtInDefaults:
failureRatioAmber: 0.01
failureRatioRed: 0.1
staleAmberHours: 48
staleRedHours: 168
failedRunIsRed: true
ImportLicense_Example:
value:
maxRecordsPerEntity: 10000
maxConcurrentImports: 2
batchSize: 100
workers: 1
securitySchemes:
OAuth2:
type: oauth2
flows:
clientCredentials:
tokenUrl: 'https://api.emporix.io/oauth/token'
scopes:
importtool.import_trigger: Needed to trigger, schedule, monitor, and cancel import runs and to read configurations, streams, schedules, runs, and imported data.
security:
- OAuth2:
- importtool.import_trigger