@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 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 metadata — most providers expose filename, filesize,
5612
- and lastmodified (e.g. ["endswith", ["string", ["extract", "filename"]], ".csv"]).
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 specific fields available for file filtering are the contained in the `fileMeta` property.
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. **filename**: The name of the file (with extension)
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", "filename"]], ".csv"]`
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. **lastmodified**: The last modification timestamp of the file
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", "lastmodified"]], 1672531200000]` (2023-01-01T00:00:00Z in epoch milliseconds)
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: Callback configuration for once exports, used to mark records as exported in the source system after successful processing.
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: A child job for an export step within a flow run.
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, by a filter or by an import's ignore-existing or ignore-missing
7442
- rule. Records an import's filter skips count in that import's child job; records an export's
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: Number of pages processed by downstream imports.
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
- - ignored
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
- ignored: The record was skipped by a filter or routing rule.
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 or null is defined: it renders empty, and the request is sent without the value.
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": ["per_record"],
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, UPSERT, or ignore-existing/skip-duplicates logic, use queryType `["per_record"]` with the `query` field instead.
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: A child job for an export step within a flow run.
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, by a filter or by an import's ignore-existing or ignore-missing
1575
- rule. Records an import's filter skips count in that import's child job; records an export's
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: Number of pages processed by downstream imports.
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:
@@ -1177,6 +1177,14 @@ paths:
1177
1177
  (`"data": {"record": {...}}`). Double braces HTML-escape the value (`&` renders as `&amp;`);
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 or null is defined: it renders empty, and the request is sent without the value.
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": ["per_record"],
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, UPSERT, or ignore-existing/skip-duplicates logic, use queryType `["per_record"]` with the `query` field instead.
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 metadata — most providers expose filename, filesize,
30625
- and lastmodified (e.g. ["endswith", ["string", ["extract", "filename"]], ".csv"]).
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 specific fields available for file filtering are the contained in the `fileMeta` property.
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. **filename**: The name of the file (with extension)
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", "filename"]], ".csv"]`
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. **lastmodified**: The last modification timestamp of the file
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", "lastmodified"]], 1672531200000]` (2023-01-01T00:00:00Z in epoch milliseconds)
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: Callback configuration for once exports, used to mark records as exported in the source system after successful processing.
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@celigo/api-specs",
3
- "version": "0.2.176",
3
+ "version": "0.2.178",
4
4
  "private": false,
5
5
  "description": "Public OpenAPI bundles (dist/) and the celigo-cli lint schema pack (schemas.json).",
6
6
  "keywords": [
package/schemas.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "provenance": {
3
3
  "repo": "celigo/integrator-api-specs",
4
- "iasCommit": "06b10943",
4
+ "iasCommit": "d78b4324",
5
5
  "generatedAt": "2026-10-22"
6
6
  },
7
7
  "roots": {