@celigo/api-specs 0.2.176 → 0.2.178
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/export.yml +17 -8
- package/dist/flow.yml +21 -6
- package/dist/import.yml +16 -8
- package/dist/job.yml +11 -4
- package/dist/processor.yml +8 -0
- package/dist/tool.yml +33 -16
- package/package.json +1 -1
- package/schemas.json +1 -1
package/dist/export.yml
CHANGED
|
@@ -5608,31 +5608,37 @@ components:
|
|
|
5608
5608
|
description: |-
|
|
5609
5609
|
Selects which files are processed: files matching the filter criteria are exported,
|
|
5610
5610
|
and non-matching files are skipped entirely before processing begins. Filterable
|
|
5611
|
-
fields come from each file's
|
|
5612
|
-
and
|
|
5611
|
+
fields come from each file's listing entry: the name as `fileName`, the size as
|
|
5612
|
+
`filesize`, and the modified time as `lastModifiedTime` on FTP, SFTP and S3 or
|
|
5613
|
+
`modifiedTime` on cloud-storage folders (`http.type: "file"`)
|
|
5614
|
+
(e.g. ["endswith", ["string", ["extract", "fileName"]], ".csv"]). There is no
|
|
5615
|
+
`lastmodified` key.
|
|
5613
5616
|
allOf:
|
|
5614
5617
|
- $ref: '#/components/schemas/Filter'
|
|
5615
5618
|
x-celigo-ai-guidance:
|
|
5616
5619
|
- |-
|
|
5617
5620
|
## AVAILABLE FILTER FIELDS
|
|
5618
5621
|
|
|
5619
|
-
The
|
|
5622
|
+
The fields a file filter reads are on each file's listing entry, before the file is
|
|
5623
|
+
downloaded. They are not the records' `fileMeta`, though some names match.
|
|
5620
5624
|
|
|
5621
5625
|
### Common Filter Fields
|
|
5622
5626
|
|
|
5623
5627
|
These are the most commonly available fields across most file providers:
|
|
5624
5628
|
|
|
5625
|
-
1. **
|
|
5629
|
+
1. **fileName**: The name of the file (with extension)
|
|
5626
5630
|
- Example filter: Match files with specific extensions or naming patterns
|
|
5627
|
-
- Usage: `["endswith", ["string", ["extract", "
|
|
5631
|
+
- Usage: `["endswith", ["string", ["extract", "fileName"]], ".csv"]`
|
|
5628
5632
|
|
|
5629
5633
|
2. **filesize**: The size of the file in bytes
|
|
5630
5634
|
- Example filter: Skip files that are too large or too small
|
|
5631
5635
|
- Usage: `["lessthan", ["number", ["extract", "filesize"]], 1000000]`
|
|
5632
5636
|
|
|
5633
|
-
3. **
|
|
5637
|
+
3. **lastModifiedTime** (FTP, SFTP, S3) or **modifiedTime** (cloud-storage folders): The
|
|
5638
|
+
last modification timestamp of the file. There is no `lastmodified` key.
|
|
5634
5639
|
- Example filter: Process only files created/modified within a specific date range
|
|
5635
|
-
- Usage: `["greaterthan", ["epochtime", ["extract", "
|
|
5640
|
+
- Usage (FTP, SFTP, S3): `["greaterthan", ["epochtime", ["extract", "lastModifiedTime"]], 1672531200000]` (2023-01-01T00:00:00Z in epoch milliseconds)
|
|
5641
|
+
- Usage (cloud-storage folders): `["greaterthan", ["epochtime", ["extract", "modifiedTime"]], 1672531200000]`
|
|
5636
5642
|
backupPath:
|
|
5637
5643
|
type: string
|
|
5638
5644
|
description: Path where backup copies of source files are stored before processing.
|
|
@@ -6636,7 +6642,10 @@ components:
|
|
|
6636
6642
|
- async_helper
|
|
6637
6643
|
once:
|
|
6638
6644
|
type: object
|
|
6639
|
-
description:
|
|
6645
|
+
description: |-
|
|
6646
|
+
Callback configuration for once exports, used to mark records as exported in the source system after successful processing.
|
|
6647
|
+
Called only while the export's `type` is `once`: an export with no `type` keeps a saved `once` and never calls it, so every
|
|
6648
|
+
run reads every record again (live-verified 2026-10-22).
|
|
6640
6649
|
properties:
|
|
6641
6650
|
relativeURI:
|
|
6642
6651
|
type: string
|
package/dist/flow.yml
CHANGED
|
@@ -7208,7 +7208,10 @@ components:
|
|
|
7208
7208
|
- retry
|
|
7209
7209
|
- bulk_retry
|
|
7210
7210
|
x-enumDescriptions:
|
|
7211
|
-
export:
|
|
7211
|
+
export: |-
|
|
7212
|
+
A child job for an export step within a flow run: the flow's source export, or a
|
|
7213
|
+
lookup step (an export with `isLookup`), whose job counts the pages it looked up in
|
|
7214
|
+
`numPagesProcessed`.
|
|
7212
7215
|
import: A child job for an import step within a flow run.
|
|
7213
7216
|
flow: A parent flow-run job that orchestrates the full pipeline.
|
|
7214
7217
|
retry: A retry of a single failed record from a previous job.
|
|
@@ -7438,8 +7441,9 @@ components:
|
|
|
7438
7441
|
type: integer
|
|
7439
7442
|
readOnly: true
|
|
7440
7443
|
description: |-
|
|
7441
|
-
Number of records skipped
|
|
7442
|
-
rule
|
|
7444
|
+
Number of records skipped: by a filter, by an import's ignore-existing or ignore-missing
|
|
7445
|
+
rule, by an import's preMap hook that returned no data for the record, or by a lookup step's
|
|
7446
|
+
input filter (the record continues without the lookup's data). Records an import's filter skips count in that import's child job; records an export's
|
|
7443
7447
|
output filter drops count in the export's child job, whose `numSuccess` then counts only the
|
|
7444
7448
|
records that passed (an export that read 6 records and dropped 3 reads `numSuccess` 3,
|
|
7445
7449
|
`numIgnore` 3; live-verified 2026-10-22). Filtered records raise no error.
|
|
@@ -7466,7 +7470,10 @@ components:
|
|
|
7466
7470
|
numPagesProcessed:
|
|
7467
7471
|
type: integer
|
|
7468
7472
|
readOnly: true
|
|
7469
|
-
description:
|
|
7473
|
+
description: |-
|
|
7474
|
+
Number of pages processed by downstream steps: imports and lookup steps. A source export's
|
|
7475
|
+
child job reads 0, a lookup step's and an import's count the pages they processed, and a
|
|
7476
|
+
parent flow job sums its children.
|
|
7470
7477
|
examples:
|
|
7471
7478
|
- 10
|
|
7472
7479
|
oIndex:
|
|
@@ -8080,11 +8087,13 @@ components:
|
|
|
8080
8087
|
enum:
|
|
8081
8088
|
- success
|
|
8082
8089
|
- error
|
|
8083
|
-
-
|
|
8090
|
+
- ignore
|
|
8084
8091
|
x-enumDescriptions:
|
|
8085
8092
|
success: The record was processed successfully at this step.
|
|
8086
8093
|
error: The record encountered an error during processing.
|
|
8087
|
-
|
|
8094
|
+
ignore: |-
|
|
8095
|
+
The step skipped the record: its filter, a preMap hook that returned no data for the
|
|
8096
|
+
record, or an ignore-existing or ignore-missing rule. `stage` names which.
|
|
8088
8097
|
timeTaken:
|
|
8089
8098
|
type: integer
|
|
8090
8099
|
description: Milliseconds spent at this step for this record.
|
|
@@ -8106,8 +8115,14 @@ components:
|
|
|
8106
8115
|
Pipeline stage at which this step entry was recorded. Observed values include `apiCall`
|
|
8107
8116
|
(the adaptor invocation itself). Useful for filtering metadata responses when a step has
|
|
8108
8117
|
multiple stage entries across a single record's pass.
|
|
8118
|
+
|
|
8119
|
+
On an entry with `status: ignore`, the stage that skipped the record, recorded even on a run
|
|
8120
|
+
logged at `basic` (whose stage data is empty): `inputFilter` for the step's filter,
|
|
8121
|
+
`preMapHook` for a preMap hook that returned no data for the record, and an empty string for
|
|
8122
|
+
an ignore-existing rule.
|
|
8109
8123
|
examples:
|
|
8110
8124
|
- apiCall
|
|
8125
|
+
- inputFilter
|
|
8111
8126
|
ExecutionLogMetadataResponse:
|
|
8112
8127
|
type: object
|
|
8113
8128
|
description: |-
|
package/dist/import.yml
CHANGED
|
@@ -1811,7 +1811,7 @@ components:
|
|
|
1811
1811
|
Use separate array elements per operation rather than `{{#if}}` conditionals inside a single URI.
|
|
1812
1812
|
URI templates render strictly: a path that is undefined on the record — such as `record.<field>` on a grouped record, whose root is `rows` — fails the request instead of rendering empty.
|
|
1813
1813
|
A field the record lacks, or a `{{lookup.<name>}}` whose lookup found nothing, fails that record before anything is sent, with `handlebars_template_parse_error` (source `application`, classification `parse`): `Failed to generate request url from template: <URL>. Details: "<field>" not defined in the model.` That is missing data, not template syntax, and a retry of the same record fails the same way: send records that may lack the destination id through a composite UPDATE/CREATE import (`existingExtract`), or skip them with `ignoreMissing` and `ignoreExtract`.
|
|
1814
|
-
A field that holds an empty string
|
|
1814
|
+
A field that holds an empty string renders empty, and the request is sent without the value. A field that holds null renders the text `null` (a URI of `/orders/{{record.id}}` is sent as `/orders/null`), and a field under an object that is null fails the record like a missing one (`"<field>" not defined in null`).
|
|
1815
1815
|
x-celigo-ai-guidance:
|
|
1816
1816
|
- '**CRITICAL: This MUST be an array of strings, NOT an object.**'
|
|
1817
1817
|
- |-
|
|
@@ -1998,7 +1998,14 @@ components:
|
|
|
1998
1998
|
(``"{{record.name}}"``): double braces JSON-escape the value at run time, with no HTML
|
|
1999
1999
|
escaping. Triple braces insert the raw text, so a value holding a double quote,
|
|
2000
2000
|
backslash, newline or tab fails that record with 422 ``invalid_json`` before anything
|
|
2001
|
-
is sent.
|
|
2001
|
+
is sent. Double braces write a null value -- a null field, or any field under an
|
|
2002
|
+
object that is null -- as the text ``null``, so ``"{{record.customer.name}}"`` sends
|
|
2003
|
+
the string "null" (triple braces rendered ``{{{record.customer.name}}}`` empty,
|
|
2004
|
+
whether ``customer`` or its ``name`` was null). Guard a nullable field with
|
|
2005
|
+
``{{#if record.customer.name}}{{record.customer.name}}{{/if}}`` or
|
|
2006
|
+
``{{#if record.customer}}{{record.customer.name}}{{/if}}``: both render empty for a
|
|
2007
|
+
null field and for a null object. The Handlebars processor renders the unguarded null
|
|
2008
|
+
empty, so judge it by an import preview or a run.
|
|
2002
2009
|
- |-
|
|
2003
2010
|
Every request context carries two data roots: ``data`` — the list of records in
|
|
2004
2011
|
the request, always present (Pattern B) — and ONE shape-specific root that follows
|
|
@@ -5418,7 +5425,7 @@ components:
|
|
|
5418
5425
|
- bulk_load
|
|
5419
5426
|
x-enumDescriptions:
|
|
5420
5427
|
INSERT: Legacy value for insert operations; use bulk_insert or per_record instead.
|
|
5421
|
-
UPDATE: Legacy value for update operations; use per_record instead.
|
|
5428
|
+
UPDATE: Legacy value for update operations; use per_page or per_record instead.
|
|
5422
5429
|
bulk_insert: Batch INSERT via multi-row VALUES clause for efficient bulk data loading.
|
|
5423
5430
|
per_record: Execute one SQL statement per record, giving full control over individual record SQL.
|
|
5424
5431
|
per_page: Execute one SQL statement per page (batch) of records.
|
|
@@ -5428,7 +5435,7 @@ components:
|
|
|
5428
5435
|
description: |-
|
|
5429
5436
|
Execution strategy for the SQL operation, which determines the required companion field: per_record, per_page, and first_page require `query`; bulk_insert requires `bulkInsert`; bulk_load requires `bulkLoad`.
|
|
5430
5437
|
Prefer the highest-performance type the operation supports: bulk_load (Snowflake, Google BigQuery, Microsoft SQL Server on a cloud connection, Azure Synapse and Amazon Redshift — handles INSERT, upsert via `bulkLoad.primaryKeys`, and custom merge or ignore-existing logic via `bulkLoad.overrideMergeQuery`), then bulk_insert for pure INSERTs, then per_page, then per_record only when the logic cannot be expressed as a batch operation.
|
|
5431
|
-
For UPDATE, UPSERT, or ignore-existing logic on databases without bulk_load support, use per_page or per_record with `query` — bulk_insert has no duplicate-checking logic.
|
|
5438
|
+
For UPDATE, UPSERT, or ignore-existing logic on databases without bulk_load support, use per_page or per_record with `query` — bulk_insert has no duplicate-checking logic. Prefer per_page when the statement can loop `batch_of_records`, and use per_record when the SQL can't be written as one batch statement.
|
|
5432
5439
|
Set a single value; do not combine types or use the legacy INSERT and UPDATE values.
|
|
5433
5440
|
per_page statements render against the whole batch (`batch_of_records`) rather than a single record — loop with `{{#each batch_of_records}}...{{record.fieldName}}...{{/each}}`, with the same quoting as `query` (double braces for strings, triple for numbers).
|
|
5434
5441
|
|
|
@@ -5490,9 +5497,10 @@ components:
|
|
|
5490
5497
|
### UPDATE Operation
|
|
5491
5498
|
Prompt: "Update inventory counts"
|
|
5492
5499
|
```json
|
|
5493
|
-
"queryType": ["
|
|
5494
|
-
"query": ["UPDATE inventory SET qty = {{{record.qty}}} WHERE sku = {{record.sku}}"]
|
|
5500
|
+
"queryType": ["per_page"],
|
|
5501
|
+
"query": ["{{#each batch_of_records}}UPDATE inventory SET qty = {{{record.qty}}} WHERE sku = {{record.sku}};{{/each}}"]
|
|
5495
5502
|
```
|
|
5503
|
+
Use `"queryType": ["per_record"]` with `"query": ["UPDATE inventory SET qty = {{{record.qty}}} WHERE sku = {{record.sku}}"]` when the SQL can't be written as one batch statement.
|
|
5496
5504
|
|
|
5497
5505
|
### Run Once Per Page
|
|
5498
5506
|
Prompt: "Execute this stored procedure for each page of results"
|
|
@@ -5510,7 +5518,7 @@ components:
|
|
|
5510
5518
|
type: object
|
|
5511
5519
|
description: |-
|
|
5512
5520
|
Configuration for batch INSERTs via a multi-row VALUES clause; required when queryType is `["bulk_insert"]` and must not be set otherwise.
|
|
5513
|
-
Only suited to pure INSERTs — for UPDATE
|
|
5521
|
+
Only suited to pure INSERTs — for UPDATE or UPSERT, use queryType `["per_page"]` (a statement that loops `batch_of_records`) or `["per_record"]` with the `query` field instead, and for ignore-existing/skip-duplicates logic `["per_record"]`.
|
|
5514
5522
|
x-celigo-ai-guidance:
|
|
5515
5523
|
- |-
|
|
5516
5524
|
**CRITICAL: This object is ONLY used when `queryType` is `["bulk_insert"]`.**
|
|
@@ -5520,7 +5528,7 @@ components:
|
|
|
5520
5528
|
- Pure INSERT operation with NO ignoreExisting/duplicate checking
|
|
5521
5529
|
|
|
5522
5530
|
❌ **DO NOT SET THIS** when:
|
|
5523
|
-
- `queryType` is `["per_record"]` (use `query` field instead)
|
|
5531
|
+
- `queryType` is `["per_page"]` or `["per_record"]` (use the `query` field instead)
|
|
5524
5532
|
- Operation involves UPDATE, UPSERT, or ignoreExisting logic
|
|
5525
5533
|
|
|
5526
5534
|
If the prompt mentions "ignore existing", "skip duplicates", or "match on field",
|
package/dist/job.yml
CHANGED
|
@@ -1341,7 +1341,10 @@ components:
|
|
|
1341
1341
|
- retry
|
|
1342
1342
|
- bulk_retry
|
|
1343
1343
|
x-enumDescriptions:
|
|
1344
|
-
export:
|
|
1344
|
+
export: |-
|
|
1345
|
+
A child job for an export step within a flow run: the flow's source export, or a
|
|
1346
|
+
lookup step (an export with `isLookup`), whose job counts the pages it looked up in
|
|
1347
|
+
`numPagesProcessed`.
|
|
1345
1348
|
import: A child job for an import step within a flow run.
|
|
1346
1349
|
flow: A parent flow-run job that orchestrates the full pipeline.
|
|
1347
1350
|
retry: A retry of a single failed record from a previous job.
|
|
@@ -1571,8 +1574,9 @@ components:
|
|
|
1571
1574
|
type: integer
|
|
1572
1575
|
readOnly: true
|
|
1573
1576
|
description: |-
|
|
1574
|
-
Number of records skipped
|
|
1575
|
-
rule
|
|
1577
|
+
Number of records skipped: by a filter, by an import's ignore-existing or ignore-missing
|
|
1578
|
+
rule, by an import's preMap hook that returned no data for the record, or by a lookup step's
|
|
1579
|
+
input filter (the record continues without the lookup's data). Records an import's filter skips count in that import's child job; records an export's
|
|
1576
1580
|
output filter drops count in the export's child job, whose `numSuccess` then counts only the
|
|
1577
1581
|
records that passed (an export that read 6 records and dropped 3 reads `numSuccess` 3,
|
|
1578
1582
|
`numIgnore` 3; live-verified 2026-10-22). Filtered records raise no error.
|
|
@@ -1599,7 +1603,10 @@ components:
|
|
|
1599
1603
|
numPagesProcessed:
|
|
1600
1604
|
type: integer
|
|
1601
1605
|
readOnly: true
|
|
1602
|
-
description:
|
|
1606
|
+
description: |-
|
|
1607
|
+
Number of pages processed by downstream steps: imports and lookup steps. A source export's
|
|
1608
|
+
child job reads 0, a lookup step's and an import's count the pages they processed, and a
|
|
1609
|
+
parent flow job sums its children.
|
|
1603
1610
|
examples:
|
|
1604
1611
|
- 10
|
|
1605
1612
|
oIndex:
|
package/dist/processor.yml
CHANGED
|
@@ -1177,6 +1177,14 @@ paths:
|
|
|
1177
1177
|
(`"data": {"record": {...}}`). Double braces HTML-escape the value (`&` renders as `&`);
|
|
1178
1178
|
triple braces insert it unchanged. A `timestamp` with no time zone renders in UTC.
|
|
1179
1179
|
|
|
1180
|
+
A null value, or a field under an object that is null, renders empty here. An HTTP import
|
|
1181
|
+
escapes values its own way, at run time and in the import preview: in its JSON body a
|
|
1182
|
+
double-brace value that is null, or under a null object, is written as the text `null`
|
|
1183
|
+
(triple braces rendered `{{{record.customer.name}}}` empty, whether `customer` or its `name`
|
|
1184
|
+
was null); in its relative URI a null field is sent as the text
|
|
1185
|
+
`null`, and a field under a null object fails the record before anything is sent. Check a
|
|
1186
|
+
nullable field with an import preview, not here.
|
|
1187
|
+
|
|
1180
1188
|
An unknown helper is refused with 422. `GET /v1/processors` lists helpers under the handlebars
|
|
1181
1189
|
entry's `helperFunctions`, but that list is not complete: `eq` and `truncateWords`, for
|
|
1182
1190
|
example, render although it omits them, so render a doubtful helper once here before relying
|
package/dist/tool.yml
CHANGED
|
@@ -13668,7 +13668,7 @@ components:
|
|
|
13668
13668
|
Use separate array elements per operation rather than `{{#if}}` conditionals inside a single URI.
|
|
13669
13669
|
URI templates render strictly: a path that is undefined on the record — such as `record.<field>` on a grouped record, whose root is `rows` — fails the request instead of rendering empty.
|
|
13670
13670
|
A field the record lacks, or a `{{lookup.<name>}}` whose lookup found nothing, fails that record before anything is sent, with `handlebars_template_parse_error` (source `application`, classification `parse`): `Failed to generate request url from template: <URL>. Details: "<field>" not defined in the model.` That is missing data, not template syntax, and a retry of the same record fails the same way: send records that may lack the destination id through a composite UPDATE/CREATE import (`existingExtract`), or skip them with `ignoreMissing` and `ignoreExtract`.
|
|
13671
|
-
A field that holds an empty string
|
|
13671
|
+
A field that holds an empty string renders empty, and the request is sent without the value. A field that holds null renders the text `null` (a URI of `/orders/{{record.id}}` is sent as `/orders/null`), and a field under an object that is null fails the record like a missing one (`"<field>" not defined in null`).
|
|
13672
13672
|
x-celigo-ai-guidance:
|
|
13673
13673
|
- '**CRITICAL: This MUST be an array of strings, NOT an object.**'
|
|
13674
13674
|
- |-
|
|
@@ -13855,7 +13855,14 @@ components:
|
|
|
13855
13855
|
(``"{{record.name}}"``): double braces JSON-escape the value at run time, with no HTML
|
|
13856
13856
|
escaping. Triple braces insert the raw text, so a value holding a double quote,
|
|
13857
13857
|
backslash, newline or tab fails that record with 422 ``invalid_json`` before anything
|
|
13858
|
-
is sent.
|
|
13858
|
+
is sent. Double braces write a null value -- a null field, or any field under an
|
|
13859
|
+
object that is null -- as the text ``null``, so ``"{{record.customer.name}}"`` sends
|
|
13860
|
+
the string "null" (triple braces rendered ``{{{record.customer.name}}}`` empty,
|
|
13861
|
+
whether ``customer`` or its ``name`` was null). Guard a nullable field with
|
|
13862
|
+
``{{#if record.customer.name}}{{record.customer.name}}{{/if}}`` or
|
|
13863
|
+
``{{#if record.customer}}{{record.customer.name}}{{/if}}``: both render empty for a
|
|
13864
|
+
null field and for a null object. The Handlebars processor renders the unguarded null
|
|
13865
|
+
empty, so judge it by an import preview or a run.
|
|
13859
13866
|
- |-
|
|
13860
13867
|
Every request context carries two data roots: ``data`` — the list of records in
|
|
13861
13868
|
the request, always present (Pattern B) — and ONE shape-specific root that follows
|
|
@@ -16996,7 +17003,7 @@ components:
|
|
|
16996
17003
|
- bulk_load
|
|
16997
17004
|
x-enumDescriptions:
|
|
16998
17005
|
INSERT: Legacy value for insert operations; use bulk_insert or per_record instead.
|
|
16999
|
-
UPDATE: Legacy value for update operations; use per_record instead.
|
|
17006
|
+
UPDATE: Legacy value for update operations; use per_page or per_record instead.
|
|
17000
17007
|
bulk_insert: Batch INSERT via multi-row VALUES clause for efficient bulk data loading.
|
|
17001
17008
|
per_record: Execute one SQL statement per record, giving full control over individual record SQL.
|
|
17002
17009
|
per_page: Execute one SQL statement per page (batch) of records.
|
|
@@ -17006,7 +17013,7 @@ components:
|
|
|
17006
17013
|
description: |-
|
|
17007
17014
|
Execution strategy for the SQL operation, which determines the required companion field: per_record, per_page, and first_page require `query`; bulk_insert requires `bulkInsert`; bulk_load requires `bulkLoad`.
|
|
17008
17015
|
Prefer the highest-performance type the operation supports: bulk_load (Snowflake, Google BigQuery, Microsoft SQL Server on a cloud connection, Azure Synapse and Amazon Redshift — handles INSERT, upsert via `bulkLoad.primaryKeys`, and custom merge or ignore-existing logic via `bulkLoad.overrideMergeQuery`), then bulk_insert for pure INSERTs, then per_page, then per_record only when the logic cannot be expressed as a batch operation.
|
|
17009
|
-
For UPDATE, UPSERT, or ignore-existing logic on databases without bulk_load support, use per_page or per_record with `query` — bulk_insert has no duplicate-checking logic.
|
|
17016
|
+
For UPDATE, UPSERT, or ignore-existing logic on databases without bulk_load support, use per_page or per_record with `query` — bulk_insert has no duplicate-checking logic. Prefer per_page when the statement can loop `batch_of_records`, and use per_record when the SQL can't be written as one batch statement.
|
|
17010
17017
|
Set a single value; do not combine types or use the legacy INSERT and UPDATE values.
|
|
17011
17018
|
per_page statements render against the whole batch (`batch_of_records`) rather than a single record — loop with `{{#each batch_of_records}}...{{record.fieldName}}...{{/each}}`, with the same quoting as `query` (double braces for strings, triple for numbers).
|
|
17012
17019
|
|
|
@@ -17068,9 +17075,10 @@ components:
|
|
|
17068
17075
|
### UPDATE Operation
|
|
17069
17076
|
Prompt: "Update inventory counts"
|
|
17070
17077
|
```json
|
|
17071
|
-
"queryType": ["
|
|
17072
|
-
"query": ["UPDATE inventory SET qty = {{{record.qty}}} WHERE sku = {{record.sku}}"]
|
|
17078
|
+
"queryType": ["per_page"],
|
|
17079
|
+
"query": ["{{#each batch_of_records}}UPDATE inventory SET qty = {{{record.qty}}} WHERE sku = {{record.sku}};{{/each}}"]
|
|
17073
17080
|
```
|
|
17081
|
+
Use `"queryType": ["per_record"]` with `"query": ["UPDATE inventory SET qty = {{{record.qty}}} WHERE sku = {{record.sku}}"]` when the SQL can't be written as one batch statement.
|
|
17074
17082
|
|
|
17075
17083
|
### Run Once Per Page
|
|
17076
17084
|
Prompt: "Execute this stored procedure for each page of results"
|
|
@@ -17088,7 +17096,7 @@ components:
|
|
|
17088
17096
|
type: object
|
|
17089
17097
|
description: |-
|
|
17090
17098
|
Configuration for batch INSERTs via a multi-row VALUES clause; required when queryType is `["bulk_insert"]` and must not be set otherwise.
|
|
17091
|
-
Only suited to pure INSERTs — for UPDATE
|
|
17099
|
+
Only suited to pure INSERTs — for UPDATE or UPSERT, use queryType `["per_page"]` (a statement that loops `batch_of_records`) or `["per_record"]` with the `query` field instead, and for ignore-existing/skip-duplicates logic `["per_record"]`.
|
|
17092
17100
|
x-celigo-ai-guidance:
|
|
17093
17101
|
- |-
|
|
17094
17102
|
**CRITICAL: This object is ONLY used when `queryType` is `["bulk_insert"]`.**
|
|
@@ -17098,7 +17106,7 @@ components:
|
|
|
17098
17106
|
- Pure INSERT operation with NO ignoreExisting/duplicate checking
|
|
17099
17107
|
|
|
17100
17108
|
❌ **DO NOT SET THIS** when:
|
|
17101
|
-
- `queryType` is `["per_record"]` (use `query` field instead)
|
|
17109
|
+
- `queryType` is `["per_page"]` or `["per_record"]` (use the `query` field instead)
|
|
17102
17110
|
- Operation involves UPDATE, UPSERT, or ignoreExisting logic
|
|
17103
17111
|
|
|
17104
17112
|
If the prompt mentions "ignore existing", "skip duplicates", or "match on field",
|
|
@@ -30621,31 +30629,37 @@ components:
|
|
|
30621
30629
|
description: |-
|
|
30622
30630
|
Selects which files are processed: files matching the filter criteria are exported,
|
|
30623
30631
|
and non-matching files are skipped entirely before processing begins. Filterable
|
|
30624
|
-
fields come from each file's
|
|
30625
|
-
and
|
|
30632
|
+
fields come from each file's listing entry: the name as `fileName`, the size as
|
|
30633
|
+
`filesize`, and the modified time as `lastModifiedTime` on FTP, SFTP and S3 or
|
|
30634
|
+
`modifiedTime` on cloud-storage folders (`http.type: "file"`)
|
|
30635
|
+
(e.g. ["endswith", ["string", ["extract", "fileName"]], ".csv"]). There is no
|
|
30636
|
+
`lastmodified` key.
|
|
30626
30637
|
allOf:
|
|
30627
30638
|
- $ref: '#/components/schemas/Filter'
|
|
30628
30639
|
x-celigo-ai-guidance:
|
|
30629
30640
|
- |-
|
|
30630
30641
|
## AVAILABLE FILTER FIELDS
|
|
30631
30642
|
|
|
30632
|
-
The
|
|
30643
|
+
The fields a file filter reads are on each file's listing entry, before the file is
|
|
30644
|
+
downloaded. They are not the records' `fileMeta`, though some names match.
|
|
30633
30645
|
|
|
30634
30646
|
### Common Filter Fields
|
|
30635
30647
|
|
|
30636
30648
|
These are the most commonly available fields across most file providers:
|
|
30637
30649
|
|
|
30638
|
-
1. **
|
|
30650
|
+
1. **fileName**: The name of the file (with extension)
|
|
30639
30651
|
- Example filter: Match files with specific extensions or naming patterns
|
|
30640
|
-
- Usage: `["endswith", ["string", ["extract", "
|
|
30652
|
+
- Usage: `["endswith", ["string", ["extract", "fileName"]], ".csv"]`
|
|
30641
30653
|
|
|
30642
30654
|
2. **filesize**: The size of the file in bytes
|
|
30643
30655
|
- Example filter: Skip files that are too large or too small
|
|
30644
30656
|
- Usage: `["lessthan", ["number", ["extract", "filesize"]], 1000000]`
|
|
30645
30657
|
|
|
30646
|
-
3. **
|
|
30658
|
+
3. **lastModifiedTime** (FTP, SFTP, S3) or **modifiedTime** (cloud-storage folders): The
|
|
30659
|
+
last modification timestamp of the file. There is no `lastmodified` key.
|
|
30647
30660
|
- Example filter: Process only files created/modified within a specific date range
|
|
30648
|
-
- Usage: `["greaterthan", ["epochtime", ["extract", "
|
|
30661
|
+
- Usage (FTP, SFTP, S3): `["greaterthan", ["epochtime", ["extract", "lastModifiedTime"]], 1672531200000]` (2023-01-01T00:00:00Z in epoch milliseconds)
|
|
30662
|
+
- Usage (cloud-storage folders): `["greaterthan", ["epochtime", ["extract", "modifiedTime"]], 1672531200000]`
|
|
30649
30663
|
backupPath:
|
|
30650
30664
|
type: string
|
|
30651
30665
|
description: Path where backup copies of source files are stored before processing.
|
|
@@ -31649,7 +31663,10 @@ components:
|
|
|
31649
31663
|
- async_helper
|
|
31650
31664
|
once:
|
|
31651
31665
|
type: object
|
|
31652
|
-
description:
|
|
31666
|
+
description: |-
|
|
31667
|
+
Callback configuration for once exports, used to mark records as exported in the source system after successful processing.
|
|
31668
|
+
Called only while the export's `type` is `once`: an export with no `type` keeps a saved `once` and never calls it, so every
|
|
31669
|
+
run reads every record again (live-verified 2026-10-22).
|
|
31653
31670
|
properties:
|
|
31654
31671
|
relativeURI:
|
|
31655
31672
|
type: string
|
package/package.json
CHANGED