@celigo/api-specs 0.2.171 → 0.2.172

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
@@ -2910,15 +2910,30 @@ components:
2910
2910
  - `"lessthan"`: Value is less than specified value (is less than)
2911
2911
  - `"lessthanequals"`: Value is less than or equal to specified value (is less than or equals)
2912
2912
  - `"startswith"`: String starts with specified prefix (starts with)
2913
+ - `"notstartswith"`: String does not start with specified prefix (does not start with)
2913
2914
  - `"endswith"`: String ends with specified suffix (ends with)
2915
+ - `"notendswith"`: String does not end with specified suffix (does not end with)
2914
2916
  - `"contains"`: String contains specified substring (contains)
2915
2917
  - `"doesnotcontain"`: String does not contain specified substring (does not contain)
2916
2918
  - `"empty"`: Field is missing or empty (is empty)
2917
2919
  - `"notempty"`: Field contains a value (is not empty)
2918
- - `"matches"`: Matches a regular expression (matches)
2919
-
2920
- `isempty`, `isnotempty` and `anyof` are not operators: they are refused with 422
2921
- "Invalid operation: <name>".
2920
+ - `"matches"`: Matches a regular expression, ignoring case (matches)
2921
+
2922
+ Operator names are case-insensitive: `NOTEMPTY` and `endsWith` work and are stored
2923
+ as sent. `isempty`, `isnotempty`, `anyof`, `notcontains`, `doesnotstartwith`,
2924
+ `doesnotendwith`, `notmatches`, `doesnotmatch` and `notequal` are not operators:
2925
+ they are refused with 422 "Invalid operation: <name>", with the name in lowercase,
2926
+ both when the filter is saved and by `POST /v1/processors/filter`. To negate a
2927
+ condition, wrap it in `not`.
2928
+
2929
+ The string comparisons (`equals`, `contains`, `startswith`, `endswith` and their
2930
+ negations) are case-sensitive; wrap the field in `lowercase` to compare without case.
2931
+ `matches` is not: every pattern is compiled with the flags `gi`, so `^paid$` also
2932
+ matches `PAID` and `[a-z]` matches capital letters. An inline flag such as `(?i)`
2933
+ makes the pattern invalid. The filter still saves, but in a run every record fails
2934
+ with `FILTER_EVALUATION_FAILED` ("Invalid regular expression: /(?i)…/gi: Invalid
2935
+ group"), and `POST /v1/processors/filter` refuses the call with 422 (live-verified
2936
+ 2026-10-22).
2922
2937
 
2923
2938
  **Logical Operators**
2924
2939
  - `"and"`: All conditions must be true
@@ -12551,7 +12566,11 @@ components:
12551
12566
 
12552
12567
  **Simple Types (direct value mapping)**
12553
12568
  - `string`: Text values, converts other types to string representation
12554
- - `number`: Numeric values, attempts conversion from strings
12569
+ - `number`: Numeric values. Converts a numeric string (`"24"` → `24`,
12570
+ `"007"` → `7`) and leaves the field out for an empty string; a value
12571
+ holding letters or a thousands separator (`"1,250.00"`) fails the
12572
+ record with `non_parsable_string` (`<generate>: String contains alpha
12573
+ characters`)
12555
12574
  - `boolean`: True/false values, converts truthy/falsy values
12556
12575
 
12557
12576
  Dates are represented as strings — use `string` for date fields and
@@ -12594,8 +12613,14 @@ components:
12594
12613
  - |-
12595
12614
  Missing `dataType` is rejected at save with validation error
12596
12615
  `[mandatory_destination_datatype] Destination datatype is a
12597
- required field.` When in doubt, use `"string"` — it accepts
12598
- any source value and the runtime will coerce it.
12616
+ required field.`
12617
+ - |-
12618
+ Give each row the type the destination field expects; `"string"` is
12619
+ not a safe default. It accepts any source value, but sends a numeric
12620
+ source as text (`"24"`), which a destination that checks JSON types
12621
+ refuses. Map numeric destination fields as `number`, which fails a
12622
+ record (`non_parsable_string`) only when the value holds letters or a
12623
+ thousands separator.
12599
12624
  enum:
12600
12625
  - string
12601
12626
  - number
@@ -12607,7 +12632,7 @@ components:
12607
12632
  - objectarray
12608
12633
  x-enumDescriptions:
12609
12634
  string: Text values; converts other types to their string representation.
12610
- number: Numeric values; attempts conversion from strings.
12635
+ number: Numeric values; converts numeric strings, and fails the record (`non_parsable_string`) on letters or a thousands separator.
12611
12636
  boolean: True/false values; converts truthy/falsy values.
12612
12637
  object: Nested object built from child `mappings`, or copied whole with `extract` (not both).
12613
12638
  stringarray: Array of string values.
@@ -13635,7 +13660,11 @@ components:
13635
13660
 
13636
13661
  **Simple Types (direct value mapping)**
13637
13662
  - `string`: Text values, converts other types to string representation
13638
- - `number`: Numeric values, attempts conversion from strings
13663
+ - `number`: Numeric values. Converts a numeric string (`"24"` → `24`,
13664
+ `"007"` → `7`) and leaves the field out for an empty string; a value
13665
+ holding letters or a thousands separator (`"1,250.00"`) fails the
13666
+ record with `non_parsable_string` (`<generate>: String contains alpha
13667
+ characters`)
13639
13668
  - `boolean`: True/false values, converts truthy/falsy values
13640
13669
 
13641
13670
  Dates are represented as strings — use `string` for date fields and
@@ -13678,8 +13707,14 @@ components:
13678
13707
  - |-
13679
13708
  Missing `dataType` is rejected at save with validation error
13680
13709
  `[mandatory_destination_datatype] Destination datatype is a
13681
- required field.` When in doubt, use `"string"` — it accepts
13682
- any source value and the runtime will coerce it.
13710
+ required field.`
13711
+ - |-
13712
+ Give each row the type the destination field expects; `"string"` is
13713
+ not a safe default. It accepts any source value, but sends a numeric
13714
+ source as text (`"24"`), which a destination that checks JSON types
13715
+ refuses. Map numeric destination fields as `number`, which fails a
13716
+ record (`non_parsable_string`) only when the value holds letters or a
13717
+ thousands separator.
13683
13718
  enum:
13684
13719
  - string
13685
13720
  - number
@@ -13691,7 +13726,7 @@ components:
13691
13726
  - objectarray
13692
13727
  x-enumDescriptions:
13693
13728
  string: Text values; converts other types to their string representation.
13694
- number: Numeric values; attempts conversion from strings.
13729
+ number: Numeric values; converts numeric strings, and fails the record (`non_parsable_string`) on letters or a thousands separator.
13695
13730
  boolean: True/false values; converts truthy/falsy values.
13696
13731
  object: Nested object built from child `mappings`, or copied whole with `extract` (not both).
13697
13732
  stringarray: Array of string values.
@@ -14833,7 +14868,7 @@ components:
14833
14868
 
14834
14869
  This value is used as a fallback when:
14835
14870
  1. The source value doesn't match any key in the map
14836
- 2. allowFailures is set to true
14871
+ 2. allowFailures is true or omitted
14837
14872
 
14838
14873
  Setting an appropriate default helps prevent flow failures due to unexpected
14839
14874
  values and provides predictable behavior for edge cases.
@@ -14843,8 +14878,10 @@ components:
14843
14878
  - Original value indicators: "{Original Value}", "No mapping found"
14844
14879
  - Neutral values: "Other", "N/A", "Miscellaneous"
14845
14880
 
14846
- If allowFailures is false, a record whose value is unmapped fails and the default
14847
- is ignored.
14881
+ A save refuses a default together with an explicit `allowFailures: false`
14882
+ (422 `Lookups with default set can not have allowFailures explicitly set to
14883
+ false.`): a lookup either fails a miss (`allowFailures: false`, no default) or
14884
+ falls back to its default.
14848
14885
  examples:
14849
14886
  - Unknown
14850
14887
  - Other
@@ -14852,7 +14889,8 @@ components:
14852
14889
  - Unmapped Value
14853
14890
  - '{Original Value}'
14854
14891
  x-celigo-ai-guidance:
14855
- - 'Omit this field entirely when no fallback value is intended: a miss the lookup lets through then leaves the mapped field out, and with `allowFailures: false` a miss fails the record whatever the default. An empty string is a value, not "no default" — the save accepts `default: ""`, and an allowed miss writes `""`.'
14892
+ - 'Omit this field entirely when no fallback value is intended: a miss the lookup lets through then leaves the mapped field out, and `allowFailures: false` (which a save refuses alongside a default) fails it. An empty string is a value, not "no default" — the save accepts `default: ""`, and an allowed miss writes `""`.'
14893
+ - A default sends every unmapped value with no error, so add the missing key to the map when the destination needs the real value; keys match the extracted value exactly (case, spacing and suffixes count), and a save replaces the whole map.
14856
14894
  allowFailures:
14857
14895
  type:
14858
14896
  - boolean
@@ -15378,8 +15416,8 @@ components:
15378
15416
  id:
15379
15417
  type: string
15380
15418
  description: |
15381
- Unique identifier for this field within the form.
15382
- This value typically matches the key in the fieldMap object.
15419
+ Unique identifier for this field within the form: layout containers and conditions
15420
+ refer to the field by it. Use the same string as the field's fieldMap key and its `name`.
15383
15421
  examples:
15384
15422
  - url
15385
15423
  - mode
@@ -15390,8 +15428,9 @@ components:
15390
15428
  name:
15391
15429
  type: string
15392
15430
  description: |
15393
- Name of the field, used as the property name when generating the settings object
15394
- from the submitted form data.
15431
+ Key the field's value is saved under: one top-level key of the resource's `settings`,
15432
+ which the form also reads the value back from when it opens. Nested objects inside
15433
+ `settings` are written to it directly, not through a form field's `name`.
15395
15434
  examples:
15396
15435
  - url
15397
15436
  - mode
@@ -15466,11 +15505,19 @@ components:
15466
15505
  required:
15467
15506
  type: boolean
15468
15507
  description: |
15469
- When true, the field must have a value before the form can be submitted.
15508
+ When true, the field must have a value before the form can be submitted. Only the form
15509
+ enforces it: an API write of `settings` is stored without the value.
15470
15510
  default: false
15471
15511
  examples:
15472
15512
  - true
15473
15513
  - false
15514
+ defaultValue:
15515
+ description: |
15516
+ Value the form shows while the resource's `settings` holds no value under the field's
15517
+ `name`.
15518
+ examples:
15519
+ - us
15520
+ - true
15474
15521
  multiline:
15475
15522
  type: boolean
15476
15523
  description: |
@@ -15533,15 +15580,187 @@ components:
15533
15580
  keyName:
15534
15581
  type: string
15535
15582
  description: |
15536
- For keyvalue fields, specifies the placeholder and field name for the key input.
15583
+ For keyvalue and staticMap fields, names the first column: each saved row holds that
15584
+ column's value under this key. A keyvalue field without it uses `key`.
15537
15585
  examples:
15538
15586
  - theKey
15587
+ - source
15539
15588
  valueName:
15540
15589
  type: string
15541
15590
  description: |
15542
- For keyvalue fields, specifies the placeholder and field name for the value input.
15591
+ For keyvalue and staticMap fields, names the second column: each saved row holds that
15592
+ column's value under this key. A keyvalue field without it uses `value`.
15543
15593
  examples:
15544
15594
  - theValue
15595
+ - target
15596
+ keyLabel:
15597
+ type: string
15598
+ description: |
15599
+ For staticMap fields, heading of the first column.
15600
+ examples:
15601
+ - Source status
15602
+ valueLabel:
15603
+ type: string
15604
+ description: |
15605
+ For staticMap fields, heading of the second column.
15606
+ examples:
15607
+ - Destination status
15608
+ keyOptions:
15609
+ type: array
15610
+ description: |
15611
+ For staticMap fields, suggestions offered in the first column's cells. A cell still
15612
+ accepts a typed value.
15613
+ items:
15614
+ type: object
15615
+ properties:
15616
+ label:
15617
+ type: string
15618
+ description: |
15619
+ Display text for the suggestion.
15620
+ value:
15621
+ type: string
15622
+ description: |
15623
+ Value saved when the suggestion is chosen.
15624
+ examples:
15625
+ - - label: Pending
15626
+ value: pending
15627
+ - label: Shipped
15628
+ value: shipped
15629
+ valueOptions:
15630
+ type: array
15631
+ description: |
15632
+ For staticMap fields, suggestions offered in the second column's cells. A cell still
15633
+ accepts a typed value.
15634
+ items:
15635
+ type: object
15636
+ properties:
15637
+ label:
15638
+ type: string
15639
+ description: |
15640
+ Display text for the suggestion.
15641
+ value:
15642
+ type: string
15643
+ description: |
15644
+ Value saved when the suggestion is chosen.
15645
+ examples:
15646
+ - - label: Open
15647
+ value: open
15648
+ - label: Closed
15649
+ value: closed
15650
+ keyResource:
15651
+ type: object
15652
+ description: |
15653
+ For staticMap fields, fills the first column's suggestions from an export the form
15654
+ carries inline in `virtual`, run the way an exportSelect's `resource` is. With
15655
+ `keyResource` or `valueResource` set, the form requires both columns in every row
15656
+ unless `keyValueRequired` is false.
15657
+ properties:
15658
+ virtual:
15659
+ type: object
15660
+ description: |
15661
+ Export document to run, inline, shaped like an exportSelect's `resource.virtual`.
15662
+ additionalProperties: true
15663
+ valueResource:
15664
+ type: object
15665
+ description: |
15666
+ For staticMap fields, fills the second column's suggestions from an export the form
15667
+ carries inline in `virtual`, run the way an exportSelect's `resource` is.
15668
+ properties:
15669
+ virtual:
15670
+ type: object
15671
+ description: |
15672
+ Export document to run, inline, shaped like an exportSelect's `resource.virtual`.
15673
+ additionalProperties: true
15674
+ keyValueRequired:
15675
+ type: boolean
15676
+ description: |
15677
+ For staticMap fields with `keyResource` or `valueResource`, when false, saves rows
15678
+ that fill only one column; by default the form drops them.
15679
+ default: true
15680
+ examples:
15681
+ - false
15682
+ resource:
15683
+ type: object
15684
+ description: |
15685
+ For exportSelect fields, the export whose records become the options. When the form
15686
+ opens, the UI previews the export in `virtual` (with `test.limit` 100 unless the export
15687
+ sets its own) and lists the preview's `data`: each record needs a `label` and a `value`
15688
+ (a string or number serves as both), so shape them with the export's `transform`. A
15689
+ saved export can't be referenced, and an HTTP export that finds no records leaves the
15690
+ field showing an error instead of options.
15691
+ properties:
15692
+ virtual:
15693
+ type: object
15694
+ description: |
15695
+ Export document to run, inline: `adaptorType`, its adaptor block, and an optional
15696
+ `transform`. `_connectionId` defaults to the connection of the export or import the
15697
+ form belongs to; set it on any other resource's form.
15698
+ additionalProperties: true
15699
+ examples:
15700
+ - virtual:
15701
+ adaptorType: HTTPExport
15702
+ http:
15703
+ relativeURI: /v1/warehouses
15704
+ method: GET
15705
+ formType: http
15706
+ response:
15707
+ resourcePath: warehouses
15708
+ transform:
15709
+ type: expression
15710
+ expression:
15711
+ version: '2'
15712
+ rulesTwoDotZero:
15713
+ mode: create
15714
+ mappings:
15715
+ - generate: label
15716
+ extract: $.name
15717
+ dataType: string
15718
+ status: Active
15719
+ - generate: value
15720
+ extract: $.code
15721
+ dataType: string
15722
+ status: Active
15723
+ multiselect:
15724
+ type: boolean
15725
+ description: |
15726
+ For exportSelect fields, when true, the user can choose several options and the value
15727
+ is saved as an array.
15728
+ default: false
15729
+ examples:
15730
+ - true
15731
+ supportHandlebars:
15732
+ type: boolean
15733
+ description: |
15734
+ For exportSelect fields, when true, renders the `resource.virtual` export as a Handlebars
15735
+ template before each preview (all but its `transform`, `hooks`, and `filter`). On an
15736
+ integration, flow group, flow, export, or import form, the form's current values are
15737
+ under that form's scope name (`integration`, `flowGrouping`, `flow`, `export`, or
15738
+ `import`), beside the saved settings of the scopes above it, with no `settings.`
15739
+ prefix; on a connection or iClient form the template has no context. The options then
15740
+ load through `refreshOptionsOnChangesTo` or `typeAheadSearch`, or when the user
15741
+ refreshes the field.
15742
+ default: false
15743
+ examples:
15744
+ - true
15745
+ refreshOptionsOnChangesTo:
15746
+ type: array
15747
+ items:
15748
+ type: string
15749
+ description: |
15750
+ For exportSelect fields with `supportHandlebars`, ids of the fields whose values the
15751
+ templated export uses: the options load once one of them has a value and reload whenever
15752
+ one changes.
15753
+ examples:
15754
+ - - region
15755
+ typeAheadSearch:
15756
+ type: boolean
15757
+ description: |
15758
+ For exportSelect fields, when true, re-runs the templated export as the user types, with
15759
+ the typed text as this field's own value; an empty box clears the options, and typed
15760
+ text is accepted as the value.
15761
+ default: false
15762
+ examples:
15763
+ - true
15545
15764
  showDelete:
15546
15765
  type: boolean
15547
15766
  description: |
@@ -15642,7 +15861,9 @@ components:
15642
15861
  field:
15643
15862
  type: string
15644
15863
  description: |
15645
- The ID of another field whose value controls the visibility of this field.
15864
+ The ID of another field whose value controls the visibility of this field. The
15865
+ save doesn't check it: a rule naming an ID that isn't in the form counts as met,
15866
+ so the field stays visible.
15646
15867
  examples:
15647
15868
  - mode
15648
15869
  is:
@@ -15678,7 +15899,7 @@ components:
15678
15899
  - tabWithoutSave
15679
15900
  - verticalTabWithoutSave
15680
15901
  x-enumDescriptions:
15681
- column: Arranges form fields in a single vertical column layout.
15902
+ column: Places the containers side by side, one column each.
15682
15903
  collapse: Groups fields into collapsible/expandable sections.
15683
15904
  box: Wraps field groups in bordered boxes with headings.
15684
15905
  indent: Indents field groups to show hierarchy.
@@ -15687,6 +15908,15 @@ components:
15687
15908
  examples:
15688
15909
  - column
15689
15910
  - collapse
15911
+ fields:
15912
+ type: array
15913
+ items:
15914
+ type: string
15915
+ description: |
15916
+ Field IDs shown above the containers, without a heading.
15917
+ examples:
15918
+ - - region
15919
+ - vatNumber
15690
15920
  containers:
15691
15921
  type: array
15692
15922
  description: |
@@ -15726,7 +15956,8 @@ components:
15726
15956
  type: string
15727
15957
  description: |
15728
15958
  Array of field IDs that should be displayed in this container.
15729
- Each ID must correspond to a key in the fieldMap object.
15959
+ Each ID must correspond to a key in the fieldMap object: the save doesn't check it,
15960
+ and an ID that doesn't renders nothing. A field the layout doesn't list isn't shown.
15730
15961
  examples:
15731
15962
  - - A
15732
15963
  - url
@@ -15803,6 +16034,9 @@ components:
15803
16034
 
15804
16035
  The function must return a valid form object that the UI can render.
15805
16036
  Throwing an exception will signal an error to the user.
16037
+
16038
+ The UI runs the function each time it opens the form and renders the returned form instead of
16039
+ `form`, then fills in the values from `settings`; a thrown error's message replaces the form.
15806
16040
  properties:
15807
16041
  function:
15808
16042
  type: string
@@ -15826,8 +16060,10 @@ components:
15826
16060
  Reference to a predefined script resource containing the initialization function.
15827
16061
 
15828
16062
  The referenced script should contain the function specified in the
15829
- 'function' property. This script must be accessible within the user's account
15830
- and have appropriate permissions.
16063
+ 'function' property. On an integration, a flow group, a flow, an export, an import, or a
16064
+ connection, an id that isn't a script in the same account (or, on an Integration App's
16065
+ resources, one the app shares) is refused with 422 `invalid_ref`. An iClient save
16066
+ stores the id without that check.
15831
16067
  examples:
15832
16068
  - 60a2c4e6f321d800129a1a3c
15833
16069
  - 5f8d43a1b9e5a80011a35f2c
@@ -16238,8 +16474,11 @@ components:
16238
16474
  (CSV/XML/JSON) into records. Most modes take their matching configuration object (e.g. a
16239
16475
  `webhook` object when `type` is `webhook`); an HTTP or SQL `delta` export saves without a
16240
16476
  `delta` object because its request carries `{{lastExportDateTime}}`, though
16241
- `delta.startDate` sets its first window. Use `blob` only to transfer raw files without
16242
- parsing their contents.
16477
+ `delta.startDate` sets its first window. It still needs `type: delta`: on an export
16478
+ with no `type`, `{{lastExportDateTime}}` and `{{currentExportDateTime}}` render
16479
+ empty on every run, so a request that carries them goes out with blank values each time
16480
+ (live-verified 2026-10-22). Use `blob` only to transfer raw files without parsing their
16481
+ contents.
16243
16482
  x-celigo-ai-guidance:
16244
16483
  - |-
16245
16484
  ## HOW TO PICK THE TYPE VALUE
package/dist/flow.yml CHANGED
@@ -5523,6 +5523,17 @@ components:
5523
5523
  into a schedule (for example all wildcards, `? * * ? * *`), `422
5524
5524
  schedule_not_supported` when its runs would be less than a minute apart — which
5525
5525
  is also what free text such as `every 5 minutes` produces.
5526
+
5527
+ A save can store a later minute than it was sent. A minute field that is 0, 15,
5528
+ 30 or 45, a list made only of those minutes, a range that starts at minute 0, or a
5529
+ `*/N` step with N above 5 is stored 5 minutes later: `? 0 6 ? * *` as
5530
+ `? 5 6 ? * *`, `? 0,15,30,45 * ? * *` as `? 5,20,35,50 * ? * *`, `? 0-10 * ? * *`
5531
+ as `? 5-15 * ? * *`, and `? */15 * ? * *` as `? 5-59/15 * ? * *`. Any other minute
5532
+ field is kept as sent, including `? */5 * * * *` and lists that mix in other
5533
+ minutes (`? 0,10,20,30,40,50 * ? * *`), and the other fields never change. POST,
5534
+ PUT and PATCH all store it this way, the response and later reads return the
5535
+ stored value, and scheduled runs start at the stored minutes, so a flow saved for
5536
+ 06:00 runs at 06:05 (live-verified 2026-10-22).
5526
5537
  x-celigo-ai-guidance:
5527
5538
  - |-
5528
5539
  Build `schedule` as a Celigo 6-field cron:
@@ -5544,20 +5555,22 @@ components:
5544
5555
  schedule (`? * * ? * *`) with 422 `invalid_value`. Fix or clear the schedule
5545
5556
  instead of disabling the flow to get past the error.
5546
5557
  - |-
5547
- Prefer explicit lists when AUTHORING a schedule — hourly or longer:
5548
- minute `5` with an explicit hour list
5558
+ When AUTHORING a schedule, read `schedule` back after the save and give
5559
+ the user the stored times, not the requested ones: a schedule written
5560
+ for minute 0, 15, 30 or 45 can be stored, and run, 5 minutes later (see
5561
+ the description), and an explicit list is moved the same way as a step
5562
+ form. Hourly or longer: minute `5` with an explicit hour list
5549
5563
  (`? 5 0,4,8,12,16,20 ? * *` = every 4 hours;
5550
- `? 5 9 ? * 1,2,3,4,5` = weekdays 9 AM; `? 5 0 ? * *` = daily);
5551
- sub-hourly: an explicit minute list with hour `*`
5552
- (`? 0,15,30,45 * ? * *` = every 15 minutes). Lists match the UI's
5553
- schedule builder and make fire times unambiguous — the scheduler can
5554
- offset step expressions (the UI's sub-hourly presets fire at minutes
5555
- 10/25/40/55).
5564
+ `? 5 9 ? * 1,2,3,4,5` = weekdays 9:05 AM; `? 5 0 ? * *` = daily at
5565
+ 00:05); sub-hourly: an explicit minute list with hour `*`
5566
+ (`? 5,20,35,50 * ? * *` = every 15 minutes) or a step form.
5556
5567
  - |-
5557
5568
  Wildcard/step/range forms (`? */5 * * * *`, `? 10-59/30 * * * *`) are
5558
5569
  valid and the scheduler runs them — never claim an existing schedule's
5559
5570
  format is invalid or the cause of missed runs, and never rewrite a
5560
- working schedule into a different format as a fix. A new scheduled
5571
+ working schedule into a different format as a fix. A minute stored 5
5572
+ minutes after the one written is the save's normal behavior, not a
5573
+ fault, and a rewritten schedule is stored the same way. A new scheduled
5561
5574
  instance is not started while a previous run of the flow is still in
5562
5575
  progress (boundaries skipped during a long run are by design); missed
5563
5576
  runs on an enabled, unchanged flow with nothing running are a
@@ -6692,6 +6705,7 @@ components:
6692
6705
  x-celigo-ai-guidance:
6693
6706
  - Read the classification off the record; never infer it from the message text — the classifier is heuristic and identical messages can classify differently.
6694
6707
  - There is no setting, mapping, hook, or API that changes a classification; a wrong one is a Celigo Support matter.
6708
+ - '`parse` also covers a request URL template that names a field the record lacks (`handlebars_template_parse_error`, `Failed to generate request url from template: … Details: "<field>" not defined in the model.`). That is missing data, not template syntax: nothing was sent, a retry of the same record fails the same way, and the fix is the record or how the import routes it (see an HTTP import''s `relativeURI`).'
6695
6709
  classifiedBy:
6696
6710
  type: string
6697
6711
  description: '`auto` on every classified error; absent on unclassified ones.'
@@ -7364,7 +7378,11 @@ components:
7364
7378
  type: integer
7365
7379
  readOnly: true
7366
7380
  description: |-
7367
- Number of records skipped, for example by an import's ignore-existing or ignore-missing rule.
7381
+ Number of records skipped, by a filter or by an import's ignore-existing or ignore-missing
7382
+ rule. Records an import's filter skips count in that import's child job; records an export's
7383
+ output filter drops count in the export's child job, whose `numSuccess` then counts only the
7384
+ records that passed (an export that read 6 records and dropped 3 reads `numSuccess` 3,
7385
+ `numIgnore` 3; live-verified 2026-10-22). Filtered records raise no error.
7368
7386
  Summed across steps on a parent flow job; per step on a child job.
7369
7387
  examples:
7370
7388
  - 0
@@ -8072,16 +8090,18 @@ components:
8072
8090
  description: |-
8073
8091
  Execution stage whose data to return. `apiCall` holds the request and response an HTTP
8074
8092
  export or import sent. On a job whose `logMode` is `debug`, an export's transform and
8075
- output filter record under `transformation` and `outputFilter`, an import's mapping and
8076
- response mapping under `mapping` and `responseMapping`, and a script hook's `options` and
8093
+ output filter record under `transformation` and `outputFilter`, an import's filter (its
8094
+ `filter` field) under `inputFilter`, an import's mapping and response mapping under
8095
+ `mapping` and `responseMapping`, and a script hook's `options` and
8077
8096
  return value under its hook type plus `Hook` (`preSavePageHook`, `preMapHook`,
8078
8097
  `postMapHook`, `postSubmitHook`, `postResponseMapHook`), whatever the function is called;
8079
8098
  neither the bare hook name (`preMap`) nor `<functionName>Hook` returns them (live-verified
8080
- 2026-10-20).
8099
+ 2026-10-20; `inputFilter` 2026-10-22).
8081
8100
  examples:
8082
8101
  - apiCall
8083
8102
  - transformation
8084
8103
  - outputFilter
8104
+ - inputFilter
8085
8105
  - mapping
8086
8106
  - responseMapping
8087
8107
  - preSavePageHook
@@ -8114,8 +8134,11 @@ components:
8114
8134
 
8115
8135
  - `apiCall`: the request's method and URI and the response's status code. A job whose `logMode` is
8116
8136
  `detailed` or `debug` also records each side's headers and body; a `basic` job does not.
8117
- - `mapping`, `transformation`, `outputFilter`, `responseMapping`: a per-record entry carrying the
8118
- record's `recordId`, the stage's `input`, and its `output` (`outputFilter` has `success` instead).
8137
+ - `mapping`, `transformation`, `outputFilter`, `inputFilter`, `responseMapping`: a per-record entry
8138
+ carrying the record's `recordId`, the stage's `input`, and its `output`. The filter stages
8139
+ (`outputFilter` for an export's output filter, `inputFilter` for an import's filter) have
8140
+ `success` instead, `false` for a record the filter dropped (`inputFilter` live-verified
8141
+ 2026-10-22).
8119
8142
  - `preSavePageHook`, `preMapHook`, `postMapHook`, `postSubmitHook`: one entry for the record's whole
8120
8143
  group, with no `recordId`. `input` is a one-element array holding the `options` the hook received,
8121
8144
  and `output` holds what the hook returned.
@@ -1940,8 +1940,10 @@ components:
1940
1940
  - A dot path from the record root (e.g. `email`, `address.city`), read from the
1941
1941
  incoming record. A path that matches no field writes nothing.
1942
1942
  - Handlebars template (contains `{{`) for concatenation /
1943
- formatting / conditional logic (e.g.
1944
- `{{record.firstName}} {{record.lastName}}`).
1943
+ formatting / conditional logic (e.g. `{{firstName}} {{lastName}}`,
1944
+ `{{#if mobile}}{{mobile}}{{else}}{{phone}}{{/if}}`). The template reads the
1945
+ record's fields by bare name: `{{record.firstName}}` and `{{data.firstName}}`
1946
+ render nothing, so the field is left out even when the record has the value.
1945
1947
 
1946
1948
  A `$.` JSONPath (the Mapper 2.0 `mappings` syntax) reads nothing here, and a bare
1947
1949
  string is read as a field path, not a constant: set constants in `hardCodedValue`.
@@ -1982,8 +1984,9 @@ components:
1982
1984
  x-celigo-ai-guidance:
1983
1985
  - |-
1984
1986
  When true, skip this field entirely when ``extract`` / lookup
1985
- produces empty / null. Without this flag the destination field
1986
- receives null and may overwrite existing data.
1987
+ produces an empty string, null or nothing. Without this flag an
1988
+ empty string is written as ``""`` and null as null, either of which
1989
+ may overwrite existing data; a missing source is left out either way.
1987
1990
  immutable:
1988
1991
  type: boolean
1989
1992
  description: When true, the mapped value cannot be overwritten by later mapping steps.
@@ -2000,7 +2003,15 @@ components:
2000
2003
  type:
2001
2004
  - string
2002
2005
  - 'null'
2003
- description: Fallback value used when the extract yields no value.
2006
+ description: |-
2007
+ Fallback value written when the source value is an empty string, null or
2008
+ missing. Without a default, an empty string and null are written as they are
2009
+ and a missing field is left out.
2010
+ x-celigo-ai-guidance:
2011
+ - |-
2012
+ Use ``default``, not ``hardCodedValue``, for a fallback on a field that is
2013
+ sometimes empty: ``hardCodedValue`` is written on every record and replaces
2014
+ the values that exist.
2004
2015
  extractDateFormat:
2005
2016
  type: string
2006
2017
  description: Date format of the source value, used to parse it before conversion.
@@ -1300,15 +1300,30 @@ components:
1300
1300
  - `"lessthan"`: Value is less than specified value (is less than)
1301
1301
  - `"lessthanequals"`: Value is less than or equal to specified value (is less than or equals)
1302
1302
  - `"startswith"`: String starts with specified prefix (starts with)
1303
+ - `"notstartswith"`: String does not start with specified prefix (does not start with)
1303
1304
  - `"endswith"`: String ends with specified suffix (ends with)
1305
+ - `"notendswith"`: String does not end with specified suffix (does not end with)
1304
1306
  - `"contains"`: String contains specified substring (contains)
1305
1307
  - `"doesnotcontain"`: String does not contain specified substring (does not contain)
1306
1308
  - `"empty"`: Field is missing or empty (is empty)
1307
1309
  - `"notempty"`: Field contains a value (is not empty)
1308
- - `"matches"`: Matches a regular expression (matches)
1310
+ - `"matches"`: Matches a regular expression, ignoring case (matches)
1309
1311
 
1310
- `isempty`, `isnotempty` and `anyof` are not operators: they are refused with 422
1311
- "Invalid operation: <name>".
1312
+ Operator names are case-insensitive: `NOTEMPTY` and `endsWith` work and are stored
1313
+ as sent. `isempty`, `isnotempty`, `anyof`, `notcontains`, `doesnotstartwith`,
1314
+ `doesnotendwith`, `notmatches`, `doesnotmatch` and `notequal` are not operators:
1315
+ they are refused with 422 "Invalid operation: <name>", with the name in lowercase,
1316
+ both when the filter is saved and by `POST /v1/processors/filter`. To negate a
1317
+ condition, wrap it in `not`.
1318
+
1319
+ The string comparisons (`equals`, `contains`, `startswith`, `endswith` and their
1320
+ negations) are case-sensitive; wrap the field in `lowercase` to compare without case.
1321
+ `matches` is not: every pattern is compiled with the flags `gi`, so `^paid$` also
1322
+ matches `PAID` and `[a-z]` matches capital letters. An inline flag such as `(?i)`
1323
+ makes the pattern invalid. The filter still saves, but in a run every record fails
1324
+ with `FILTER_EVALUATION_FAILED` ("Invalid regular expression: /(?i)…/gi: Invalid
1325
+ group"), and `POST /v1/processors/filter` refuses the call with 422 (live-verified
1326
+ 2026-10-22).
1312
1327
 
1313
1328
  **Logical Operators**
1314
1329
  - `"and"`: All conditions must be true