@celigo/api-specs 0.2.153 → 0.2.155

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.
@@ -505,9 +505,8 @@ components:
505
505
  - For regular fields: Set to the exact property name (e.g., "firstName", "price", "isActive")
506
506
  - For object fields: Set to the object property name, then add child mappings in the 'mappings' array
507
507
  - For array fields: Set to the array property name, then configure 'buildArrayHelper'
508
- - Two structural blanks: the inner array item of an array of arrays (it has no field name),
509
- and the single top-level `objectarray` item of a `rows [ ]` mapping (the array output
510
- structure — see the array's description). A child-bearing wrapper and a source-only row that
508
+ - One structural blank: the single top-level `objectarray` item of a `rows [ ]` mapping (the
509
+ array output structure — see the array's description). A child-bearing wrapper and a source-only row that
511
510
  already exist in a saved document also stay unnamed when the tree is re-sent — filling in a
512
511
  name changes the output; it does not complete the row
513
512
 
@@ -524,7 +523,9 @@ components:
524
523
  }
525
524
  ```
526
525
 
527
- When parsing existing mappings, an empty `generate` inside a parent array is an inner array; an
526
+ When parsing existing mappings, an empty `generate` on a row inside an `arrayarray` row's
527
+ `buildArrayHelper` entry is that row's inner array (`arrayarray` fails at run time; see
528
+ `dataType`); other unnamed rows are the wrappers and source-only rows described above; an
528
529
  empty `generate` on the ONLY top-level item, with `dataType: objectarray`, is the `rows [ ]` JSON
529
530
  structure — array output, bound as `rows` in templates — and is intentional, not a missing name.
530
531
  examples:
@@ -558,17 +559,25 @@ components:
558
559
  - `numberarray`: Array of numbers
559
560
  - `booleanarray`: Array of booleans
560
561
  - `objectarray`: Array of objects (most common array type)
561
- - `arrayarray`: Array of arrays (for matrix/table structures)
562
562
 
563
- Array dataTypes can be populated three ways: pass a source array
564
- through unchanged via a JSONPath `extract` alone (when the source is
565
- already an array of the right shape), construct/iterate via
566
- `buildArrayHelper`, or set a constant with `hardCodedValue`.
563
+ `arrayarray` is not a type the mapper recognizes: a save accepts it, but every record
564
+ then fails with `Destination datatype is a required field.` Build an array of arrays
565
+ in a script hook instead.
566
+
567
+ Array dataTypes are populated two ways: construct or iterate through
568
+ `buildArrayHelper` entries, or set a constant with `hardCodedValue`. The
569
+ row's own `extract` is never read on an array type: a primitive-array row
570
+ that has only an `extract` (JSONPath, Handlebars or a literal) yields
571
+ nothing, with no error, and an `objectarray` row without `buildArrayHelper`
572
+ or `hardCodedValue` is refused with 422 ("buildArrayHelper" or
573
+ "hardCodedValue" must be present for object array datatype.). To copy a
574
+ source array through unchanged, use one entry that iterates it
575
+ (`buildArrayHelper: [{"extract": "$.items[*]"}]`).
567
576
 
568
577
  IMPORTANT: The dataType controls which additional fields are relevant:
569
578
  - For date-like string fields: extractDateFormat, generateDateFormat, etc. become relevant
570
579
  - For object types: 'mappings' array becomes relevant
571
- - For array types: a JSONPath `extract` alone, `buildArrayHelper`, or `hardCodedValue` (see above)
580
+ - For array types: `buildArrayHelper` or `hardCodedValue` (see above)
572
581
 
573
582
  When analyzing existing mappings or generating new ones, always check dataType first
574
583
  to understand what additional fields should be present.
@@ -587,7 +596,6 @@ components:
587
596
  - numberarray
588
597
  - booleanarray
589
598
  - objectarray
590
- - arrayarray
591
599
  x-enumDescriptions:
592
600
  string: Text values; converts other types to their string representation.
593
601
  number: Numeric values; attempts conversion from strings.
@@ -597,7 +605,6 @@ components:
597
605
  numberarray: Array of numeric values.
598
606
  booleanarray: Array of boolean values.
599
607
  objectarray: Array of objects, the most common array type.
600
- arrayarray: Array of arrays, used for matrix or table structures.
601
608
  examples:
602
609
  - string
603
610
  - number
@@ -640,9 +647,10 @@ components:
640
647
  - Valid on scalars and on `object` rows, where the rendered output must
641
648
  parse into an object. On an array row the template goes in a
642
649
  `buildArrayHelper` entry instead: on an `objectarray` row's own
643
- `extract` it is refused with 422 ("buildArrayHelper" must be present
644
- for object array datatype), and on a primitive-array row's own
645
- `extract` it renders null without an error
650
+ `extract` it is refused with 422 ("buildArrayHelper" or "hardCodedValue"
651
+ must be present for object array datatype.), and on a primitive-array
652
+ row's own `extract` it yields nothing (the field is left out) without an
653
+ error
646
654
 
647
655
  ```json
648
656
  "extract": "{{record.price}} {{record.currency}}" // Combines two fields
@@ -784,8 +792,10 @@ components:
784
792
  Explicit JSON `null` is itself a valid fallback: the destination field is written as
785
793
  JSON null when the extract yields nothing (the Mapper UI's "Use null as default value"
786
794
  action). Omitting the key entirely means no fallback — the field is left out of the
787
- output when the extract is empty (the UI's "Do nothing" action). Failing the record
788
- instead is `conditional.when: fail_record_when_empty`, which excludes a default.
795
+ output when the extract is missing or an empty string (the UI's "Do nothing" action),
796
+ while a null source is still written as null unless `conditional.when` is
797
+ `extract_not_empty`. Failing the record instead is `conditional.when:
798
+ fail_record_when_empty`, which excludes a default.
789
799
  x-celigo-ai-guidance:
790
800
  - |-
791
801
  `"default": null` and `"default": ""` are distinct saved values, not
@@ -793,11 +803,14 @@ components:
793
803
  empty string renders it as `""` when the extract yields nothing.
794
804
  Preserve them verbatim when editing or migrating a mapping — dropping
795
805
  the key changes runtime behavior from "use null/empty string as
796
- default value" to "do nothing" (field omitted from the output).
806
+ default value" to "do nothing" (a missing or `""` source is left out
807
+ of the output, while a null source is written as null unless
808
+ `conditional.when` is `extract_not_empty`).
797
809
  - |-
798
810
  The four "Action to take if source field has no value" choices map to:
799
- do nothing → no `default` key (optionally `conditional.when:
800
- extract_not_empty`); use null → `"default": null`; use empty string or
811
+ do nothing → no `default` key (add `conditional.when:
812
+ extract_not_empty` to leave a null source out too; without it a null
813
+ source is written as null); use null → `"default": null`; use empty string or
801
814
  a custom value → `"default": "<value>"`; cause the record to fail →
802
815
  `conditional.when: fail_record_when_empty` with no `default` key.
803
816
  examples:
@@ -1012,8 +1025,7 @@ components:
1012
1025
 
1013
1026
  **When to Use**
1014
1027
  - REQUIRED when dataType ends with "array" (stringarray, objectarray, etc.), unless the
1015
- row passes a source array through with a JSONPath `extract` alone or sets
1016
- `hardCodedValue`
1028
+ row sets `hardCodedValue`: an array row's own `extract` is never read (see `dataType`)
1017
1029
  - Each entry in this array contributes elements to the output array
1018
1030
  - Multiple entries allow combining data from different input arrays
1019
1031
 
@@ -1097,28 +1109,10 @@ components:
1097
1109
  }
1098
1110
  ```
1099
1111
 
1100
- **For Arrays of Arrays (arrayarray)**
1101
- - Similar to objectarray, but inner arrays have empty 'generate' fields
1102
- - Used for matrix/table structures
1103
- ```json
1104
- {
1105
- "generate": "matrix",
1106
- "dataType": "arrayarray",
1107
- "buildArrayHelper": [
1108
- {
1109
- "extract": "$.rows[*]", // For each row in the rows array
1110
- "mappings": [
1111
- {
1112
- "dataType": "numberarray", // Note: No generate field for inner arrays
1113
- "buildArrayHelper": [
1114
- {"extract": "$.rows.columns[*]"} // Notice: "rows" is singular in the composite object
1115
- ]
1116
- }
1117
- ]
1118
- }
1119
- ]
1120
- }
1121
- ```
1112
+ **Arrays of Arrays**
1113
+ - The mapper has no working type for them: `arrayarray` saves, but every record
1114
+ fails with `Destination datatype is a required field.` Build an array of arrays
1115
+ in a script hook instead.
1122
1116
 
1123
1117
  **Important details**
1124
1118
 
@@ -1536,8 +1530,8 @@ components:
1536
1530
  nature is essential for building effective mappings:
1537
1531
 
1538
1532
  1. The schema is self-referential by design - a mapping can contain nested mappings of the same structure
1539
- 2. Complex data structures (nested objects, arrays of objects, arrays of arrays of objects) are ALL
1540
- handled through this recursive pattern
1533
+ 2. Complex data structures (nested objects and arrays of objects, to any depth) are ALL
1534
+ handled through this recursive pattern; an array of arrays is not (build one in a script hook)
1541
1535
  3. Each mapping handles one level of the data structure; deeper levels are handled by nested mappings
1542
1536
 
1543
1537
  When generating mappings programmatically:
@@ -1591,9 +1585,8 @@ components:
1591
1585
  - For regular fields: Set to the exact property name (e.g., "firstName", "price", "isActive")
1592
1586
  - For object fields: Set to the object property name, then add child mappings in the 'mappings' array
1593
1587
  - For array fields: Set to the array property name, then configure 'buildArrayHelper'
1594
- - Two structural blanks: the inner array item of an array of arrays (it has no field name),
1595
- and the single top-level `objectarray` item of a `rows [ ]` mapping (the array output
1596
- structure — see the array's description). A child-bearing wrapper and a source-only row that
1588
+ - One structural blank: the single top-level `objectarray` item of a `rows [ ]` mapping (the
1589
+ array output structure — see the array's description). A child-bearing wrapper and a source-only row that
1597
1590
  already exist in a saved document also stay unnamed when the tree is re-sent — filling in a
1598
1591
  name changes the output; it does not complete the row
1599
1592
 
@@ -1610,7 +1603,9 @@ components:
1610
1603
  }
1611
1604
  ```
1612
1605
 
1613
- When parsing existing mappings, an empty `generate` inside a parent array is an inner array; an
1606
+ When parsing existing mappings, an empty `generate` on a row inside an `arrayarray` row's
1607
+ `buildArrayHelper` entry is that row's inner array (`arrayarray` fails at run time; see
1608
+ `dataType`); other unnamed rows are the wrappers and source-only rows described above; an
1614
1609
  empty `generate` on the ONLY top-level item, with `dataType: objectarray`, is the `rows [ ]` JSON
1615
1610
  structure — array output, bound as `rows` in templates — and is intentional, not a missing name.
1616
1611
  examples:
@@ -1644,17 +1639,25 @@ components:
1644
1639
  - `numberarray`: Array of numbers
1645
1640
  - `booleanarray`: Array of booleans
1646
1641
  - `objectarray`: Array of objects (most common array type)
1647
- - `arrayarray`: Array of arrays (for matrix/table structures)
1648
1642
 
1649
- Array dataTypes can be populated three ways: pass a source array
1650
- through unchanged via a JSONPath `extract` alone (when the source is
1651
- already an array of the right shape), construct/iterate via
1652
- `buildArrayHelper`, or set a constant with `hardCodedValue`.
1643
+ `arrayarray` is not a type the mapper recognizes: a save accepts it, but every record
1644
+ then fails with `Destination datatype is a required field.` Build an array of arrays
1645
+ in a script hook instead.
1646
+
1647
+ Array dataTypes are populated two ways: construct or iterate through
1648
+ `buildArrayHelper` entries, or set a constant with `hardCodedValue`. The
1649
+ row's own `extract` is never read on an array type: a primitive-array row
1650
+ that has only an `extract` (JSONPath, Handlebars or a literal) yields
1651
+ nothing, with no error, and an `objectarray` row without `buildArrayHelper`
1652
+ or `hardCodedValue` is refused with 422 ("buildArrayHelper" or
1653
+ "hardCodedValue" must be present for object array datatype.). To copy a
1654
+ source array through unchanged, use one entry that iterates it
1655
+ (`buildArrayHelper: [{"extract": "$.items[*]"}]`).
1653
1656
 
1654
1657
  IMPORTANT: The dataType controls which additional fields are relevant:
1655
1658
  - For date-like string fields: extractDateFormat, generateDateFormat, etc. become relevant
1656
1659
  - For object types: 'mappings' array becomes relevant
1657
- - For array types: a JSONPath `extract` alone, `buildArrayHelper`, or `hardCodedValue` (see above)
1660
+ - For array types: `buildArrayHelper` or `hardCodedValue` (see above)
1658
1661
 
1659
1662
  When analyzing existing mappings or generating new ones, always check dataType first
1660
1663
  to understand what additional fields should be present.
@@ -1673,7 +1676,6 @@ components:
1673
1676
  - numberarray
1674
1677
  - booleanarray
1675
1678
  - objectarray
1676
- - arrayarray
1677
1679
  x-enumDescriptions:
1678
1680
  string: Text values; converts other types to their string representation.
1679
1681
  number: Numeric values; attempts conversion from strings.
@@ -1683,7 +1685,6 @@ components:
1683
1685
  numberarray: Array of numeric values.
1684
1686
  booleanarray: Array of boolean values.
1685
1687
  objectarray: Array of objects, the most common array type.
1686
- arrayarray: Array of arrays, used for matrix or table structures.
1687
1688
  examples:
1688
1689
  - string
1689
1690
  - number
@@ -1726,9 +1727,10 @@ components:
1726
1727
  - Valid on scalars and on `object` rows, where the rendered output must
1727
1728
  parse into an object. On an array row the template goes in a
1728
1729
  `buildArrayHelper` entry instead: on an `objectarray` row's own
1729
- `extract` it is refused with 422 ("buildArrayHelper" must be present
1730
- for object array datatype), and on a primitive-array row's own
1731
- `extract` it renders null without an error
1730
+ `extract` it is refused with 422 ("buildArrayHelper" or "hardCodedValue"
1731
+ must be present for object array datatype.), and on a primitive-array
1732
+ row's own `extract` it yields nothing (the field is left out) without an
1733
+ error
1732
1734
 
1733
1735
  ```json
1734
1736
  "extract": "{{record.price}} {{record.currency}}" // Combines two fields
@@ -1870,8 +1872,10 @@ components:
1870
1872
  Explicit JSON `null` is itself a valid fallback: the destination field is written as
1871
1873
  JSON null when the extract yields nothing (the Mapper UI's "Use null as default value"
1872
1874
  action). Omitting the key entirely means no fallback — the field is left out of the
1873
- output when the extract is empty (the UI's "Do nothing" action). Failing the record
1874
- instead is `conditional.when: fail_record_when_empty`, which excludes a default.
1875
+ output when the extract is missing or an empty string (the UI's "Do nothing" action),
1876
+ while a null source is still written as null unless `conditional.when` is
1877
+ `extract_not_empty`. Failing the record instead is `conditional.when:
1878
+ fail_record_when_empty`, which excludes a default.
1875
1879
  x-celigo-ai-guidance:
1876
1880
  - |-
1877
1881
  `"default": null` and `"default": ""` are distinct saved values, not
@@ -1879,11 +1883,14 @@ components:
1879
1883
  empty string renders it as `""` when the extract yields nothing.
1880
1884
  Preserve them verbatim when editing or migrating a mapping — dropping
1881
1885
  the key changes runtime behavior from "use null/empty string as
1882
- default value" to "do nothing" (field omitted from the output).
1886
+ default value" to "do nothing" (a missing or `""` source is left out
1887
+ of the output, while a null source is written as null unless
1888
+ `conditional.when` is `extract_not_empty`).
1883
1889
  - |-
1884
1890
  The four "Action to take if source field has no value" choices map to:
1885
- do nothing → no `default` key (optionally `conditional.when:
1886
- extract_not_empty`); use null → `"default": null`; use empty string or
1891
+ do nothing → no `default` key (add `conditional.when:
1892
+ extract_not_empty` to leave a null source out too; without it a null
1893
+ source is written as null); use null → `"default": null`; use empty string or
1887
1894
  a custom value → `"default": "<value>"`; cause the record to fail →
1888
1895
  `conditional.when: fail_record_when_empty` with no `default` key.
1889
1896
  examples:
@@ -2098,8 +2105,7 @@ components:
2098
2105
 
2099
2106
  **When to Use**
2100
2107
  - REQUIRED when dataType ends with "array" (stringarray, objectarray, etc.), unless the
2101
- row passes a source array through with a JSONPath `extract` alone or sets
2102
- `hardCodedValue`
2108
+ row sets `hardCodedValue`: an array row's own `extract` is never read (see `dataType`)
2103
2109
  - Each entry in this array contributes elements to the output array
2104
2110
  - Multiple entries allow combining data from different input arrays
2105
2111
 
@@ -2183,28 +2189,10 @@ components:
2183
2189
  }
2184
2190
  ```
2185
2191
 
2186
- **For Arrays of Arrays (arrayarray)**
2187
- - Similar to objectarray, but inner arrays have empty 'generate' fields
2188
- - Used for matrix/table structures
2189
- ```json
2190
- {
2191
- "generate": "matrix",
2192
- "dataType": "arrayarray",
2193
- "buildArrayHelper": [
2194
- {
2195
- "extract": "$.rows[*]", // For each row in the rows array
2196
- "mappings": [
2197
- {
2198
- "dataType": "numberarray", // Note: No generate field for inner arrays
2199
- "buildArrayHelper": [
2200
- {"extract": "$.rows.columns[*]"} // Notice: "rows" is singular in the composite object
2201
- ]
2202
- }
2203
- ]
2204
- }
2205
- ]
2206
- }
2207
- ```
2192
+ **Arrays of Arrays**
2193
+ - The mapper has no working type for them: `arrayarray` saves, but every record
2194
+ fails with `Destination datatype is a required field.` Build an array of arrays
2195
+ in a script hook instead.
2208
2196
 
2209
2197
  **Important details**
2210
2198
 
@@ -2848,7 +2836,7 @@ components:
2848
2836
  - Unmapped Value
2849
2837
  - '{Original Value}'
2850
2838
  x-celigo-ai-guidance:
2851
- - 'Omit this field entirely when no fallback value is intended. The API rejects an empty string with [invalid_field] Invalid value '''' for field ''default'' — emitting default: "" to mean "no default" fails validation; leaving the key out is the valid spelling of that intent.'
2839
+ - '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 `""`.'
2852
2840
  allowFailures:
2853
2841
  type:
2854
2842
  - boolean
@@ -3007,6 +2995,11 @@ components:
3007
2995
  dropped fields. Either map every field downstream logic
3008
2996
  needs forward, or author Transform 2.0 with
3009
2997
  ``mode: "modify"`` instead.
2998
+ - |-
2999
+ An import's ``responseTransform`` is the exception: it accepts
3000
+ version ``"1"`` only (``"2"`` is refused with 422, verified live
3001
+ 2026-10-21), so there, map every response field that response
3002
+ mapping needs.
3010
3003
  items:
3011
3004
  type: array
3012
3005
  items:
@@ -841,6 +841,11 @@ paths:
841
841
  `ftp.concurrencyLevel` and `ftp.targetConcurrencyLevel` (the latter is unset whenever
842
842
  `autoRecoverRateLimitErrors` is false). `connectionRole` is read-only here: a body carrying
843
843
  `mcpChild` is rejected.
844
+
845
+ An OAuth connection's `http.auth.oauth.authURI` and `tokenURI` can't change: a body that
846
+ changes either is rejected with 422 "Updating the value in tokenURI is not allowed for oauth
847
+ connections due to security reasons. Please contact celigo support." (and the same for
848
+ `authURI`), and nothing is saved. To move to new OAuth URLs, create a new connection.
844
849
  operationId: updateConnection
845
850
  tags:
846
851
  - Connections
@@ -1028,7 +1033,8 @@ paths:
1028
1033
  borrowed-from connection must exist in the account and may not itself borrow
1029
1034
  (422 `connection_borrows_from_another`), and a connection that others borrow
1030
1035
  from cannot start borrowing (422 `connection_borrowed_by_another`). A
1031
- connection naming itself is accepted, so check the id before sending it.
1036
+ connection can't borrow from itself: naming its own id is rejected with 422 ("… a
1037
+ connection cannot borrow concurrency from itself."), here and on `PUT`.
1032
1038
  Settings-only changes are recorded in the connection's audit log.
1033
1039
  operationId: patchConnection
1034
1040
  tags:
@@ -1134,6 +1140,15 @@ paths:
1134
1140
  Deletes a connection. The connection is soft-deleted and retained in the
1135
1141
  recycle bin for 30 days before permanent removal. Use
1136
1142
  `POST /v1/recycleBinTTL/connections/{_id}` to restore it during that window.
1143
+
1144
+ Rejected with 422 while anything still uses the connection; the message names each
1145
+ blocker — every export or import on it, the flows they are steps of, and any connection
1146
+ whose `_borrowConcurrencyFromConnectionId` points at it (clearing that field is enough).
1147
+ Registration on an integration does not block the delete, and neither do exports, imports
1148
+ or flows already in the recycle bin; but purging the connection early
1149
+ (`DELETE /v1/recycleBinTTL/connections/{_id}`) is rejected with 422 "this document is
1150
+ referenced by Export : …" while a binned export or import still points at it, so purge the
1151
+ flows, then the exports and imports, then the connection.
1137
1152
  operationId: deleteConnection
1138
1153
  tags:
1139
1154
  - Connections
@@ -1161,7 +1176,7 @@ paths:
1161
1176
  - |-
1162
1177
  Soft-deletes the connection into the recycle bin (restorable for 30 days). Check
1163
1178
  `GET /v1/connections/{_id}/dependencies` first — a connection still referenced by flows,
1164
- exports, or imports is rejected with 422.
1179
+ exports, imports, or a borrowing connection is rejected with 422.
1165
1180
  /v1/connections/{_id}/ping:
1166
1181
  get:
1167
1182
  x-internal: false
@@ -1170,7 +1185,8 @@ paths:
1170
1185
  GET variant of the saved-connection ping — identical behavior to
1171
1186
  `POST /v1/connections/{_id}/ping`, with no request body to send. Runs the adaptor's ping
1172
1187
  routine against the connection identified by `_id` to verify its credentials and network
1173
- configuration still work; no data is read, written, or modified.
1188
+ configuration still work; no data is read, written, or modified. An `http` connection with
1189
+ no `http.ping` answers `{code: 200}` without sending any request.
1174
1190
 
1175
1191
  Inspect the response body, not the HTTP status, to determine the outcome: success and
1176
1192
  adaptor-level failures both return HTTP 200 — success is `{code: 200}`, failures are
@@ -1243,16 +1259,20 @@ paths:
1243
1259
  Behaves identically to POST /v1/connections/{_id}/ping and takes no request body — use
1244
1260
  whichever verb the client supports. Both verbs return HTTP 200 with {code: 200} on
1245
1261
  success and HTTP 200 with {errors: [...]} on adaptor-level failure, so inspect the body,
1246
- not the status code.
1262
+ not the status code. On an `http` connection, {code: 200} shows reachability only once
1263
+ `http.ping` is set: with no ping configured, nothing is sent and the answer is always
1264
+ {code: 200}.
1247
1265
  post:
1248
1266
  x-internal: false
1249
1267
  summary: Ping an existing connection
1250
1268
  description: |-
1251
1269
  Runs the adaptor's ping routine against a saved connection to verify its credentials and
1252
1270
  network configuration still work; no data is read, written, or modified. The check is
1253
- adaptor-specific (HTTP runs the ping relativeURI or baseURI, RDBMS/JDBC open a driver
1254
- session, MCP issues a tools/list, NetSuite/Salesforce do a token or session validation).
1255
- The request body is optional and ignored.
1271
+ adaptor-specific (HTTP sends the `http.ping` request, RDBMS/JDBC open a driver session,
1272
+ MCP issues a tools/list, NetSuite/Salesforce do a token or session validation). An `http`
1273
+ connection with no `http.ping` passes with `{code: 200}` without sending any request, so
1274
+ the ping proves nothing about it until a ping is configured. The request body is optional
1275
+ and ignored.
1256
1276
 
1257
1277
  Inspect the response body, not the HTTP status, to determine the outcome: success and
1258
1278
  adaptor-level failures both return HTTP 200 — success is `{code: 200}`, failures are
@@ -1362,6 +1382,10 @@ paths:
1362
1382
  - Test network connectivity
1363
1383
  - Verify permissions for basic operations
1364
1384
  - Return connection status and any error details
1385
+
1386
+ Exception: an `http` connection with no `http.ping` answers {code: 200} without sending
1387
+ any request, so it proves nothing until a ping (ideally one that needs the connection's
1388
+ credentials) is configured.
1365
1389
  /v1/connections/{_id}/proxy:
1366
1390
  post:
1367
1391
  x-internal: false
@@ -2452,6 +2476,9 @@ paths:
2452
2476
  The response is a plain-text stream (not JSON): each entry is a header line
2453
2477
  (`timestamp traceKey resourceType resourceId`) followed by a single-line JSON payload,
2454
2478
  entries separated by blank lines; paired request/response entries share a `traceKey`.
2479
+ A response payload carries only `headers` and `body` — no HTTP status code, so judge a
2480
+ failure by the body and by headers such as `Retry-After`. Connection tests are logged too:
2481
+ resource type `ping` with an empty `resourceId`, and `isPing: true` in the request payload.
2455
2482
  Logs are shared across every flow using the connection (filter by `resourceId` client-side),
2456
2483
  and sensitive header values are redacted (`"Authorization": "********"`). For execution logs
2457
2484
  tied to a specific run, use `GET /v1/flows/{_id}/jobs/{_jobId}/logs` instead.
@@ -2916,6 +2943,13 @@ paths:
2916
2943
  `/v1/connections/{_id}/oauth2` is an alias that answers identically. The URL's
2917
2944
  `state` token is one-time and expires quickly, so request a fresh one if the flow is
2918
2945
  interrupted, then poll `GET /v1/connections/{_id}` until `needsAuthorization` is `false`.
2946
+
2947
+ The URL's `redirect_uri` is the account's Celigo callback
2948
+ (`https://integrator.io/connection/oauth2callback` on North America), which the provider's
2949
+ app registration must list. On an `http` connection the client comes from the iClient in
2950
+ `http._iClientId`: with no iClient the request is rejected with 422 `unknown http authURI`,
2951
+ and an iClient whose `oauth2.validDomainNames` lacks the authorization URL's registrable
2952
+ domain is rejected as well (see the 422 examples).
2919
2953
  parameters:
2920
2954
  - name: _id
2921
2955
  in: path
@@ -2959,9 +2993,11 @@ paths:
2959
2993
  $ref: '#/components/responses/404-not-found'
2960
2994
  '422':
2961
2995
  description: |-
2962
- Connection exists but is not configured for OAuth — e.g. an FTP, S3, or plain-auth
2963
- HTTP connection. The server fails the handshake pre-check because the connection has
2964
- no `authURI` in its config.
2996
+ The handshake pre-check failed: the connection has no `authURI` in its config (an FTP,
2997
+ S3, plain-auth or client-credentials HTTP connection — nothing to authorize in a
2998
+ browser); an `http` connection has no iClient (`unknown http authURI: "<registrable
2999
+ domain>"`); or its iClient's `oauth2.validDomainNames` doesn't list the authorization
3000
+ URL's registrable domain.
2965
3001
  content:
2966
3002
  application/json:
2967
3003
  schema:
@@ -2974,6 +3010,16 @@ paths:
2974
3010
  - code: missing_required_field
2975
3011
  message: 'Expected field: authURI in the Connection to be present.'
2976
3012
  source: connector
3013
+ noIClient:
3014
+ summary: HTTP connection with no iClient
3015
+ value:
3016
+ errors:
3017
+ - message: 'unknown http authURI: "example.com"'
3018
+ domainNotListed:
3019
+ summary: The iClient's validDomainNames lacks the authorization URL's domain
3020
+ value:
3021
+ errors:
3022
+ - message: The domain of request url should be present in iClient.oauth2.validDomainNames
2977
3023
  /v1/connections/{_id}/dependencies:
2978
3024
  get:
2979
3025
  x-internal: false
@@ -4088,7 +4134,7 @@ components:
4088
4134
  connection's traffic counts against the referenced connection's limit instead of its own,
4089
4135
  and its own concurrency and auto-recovery settings have no effect. One level only: the
4090
4136
  referenced connection may not itself borrow, and a connection that others borrow from
4091
- cannot start borrowing.
4137
+ cannot start borrowing. A connection cannot reference itself (422).
4092
4138
  examples:
4093
4139
  - 615dfa0742763671275b70ab
4094
4140
  x-celigo-ai-guidance:
@@ -4125,16 +4171,21 @@ components:
4125
4171
  type: boolean
4126
4172
  description: |-
4127
4173
  When true, the connection has been taken offline and is skipped during flow execution.
4128
- The platform tests the connection after a create or `PUT` and updates this shortly
4129
- afterwards (the audit log records a `system` change; `lastModified` doesn't move), so
4130
- read it again a few seconds after the write.
4174
+ It is set by the connection test a create or `PUT` runs: the result arrives in the
4175
+ write's response or, when the target is slow to answer, shortly afterwards (the audit
4176
+ log records a `system` change; `lastModified` doesn't move), so read it again a few
4177
+ seconds after the write. On an `http` connection the write runs the test only when
4178
+ `http.ping` is configured, and an `http` connection that was never tested has no
4179
+ `offline` key.
4131
4180
  readOnly: true
4132
4181
  needsAuthorization:
4133
4182
  type: boolean
4134
4183
  readOnly: true
4135
4184
  description: |-
4136
4185
  OAuth handshake state. Celigo's OAuth callback sets it to `false` once the user consents
4137
- and the tokens are stored (see `GET /v1/connection/{_id}/oauth2`).
4186
+ and the tokens are stored (see `GET /v1/connection/{_id}/oauth2`). A connection that
4187
+ was never authorized usually has no `needsAuthorization` key, so its absence does not
4188
+ mean the connection is authorized.
4138
4189
  _sourceId:
4139
4190
  type: string
4140
4191
  format: objectId
@@ -5109,15 +5160,18 @@ components:
5109
5160
  clientId:
5110
5161
  type: string
5111
5162
  description: |
5112
- OAuth client ID (application ID) registered with the API provider.
5113
- Required for all OAuth 2.0 grant types.
5163
+ OAuth client ID (application ID) registered with the API provider. An `http`
5164
+ connection takes the app from a `custom_oauth2` iClient referenced by `http._iClientId`
5165
+ (an `mcp` connection from `mcp.http._iClientId`) and doesn't store this field: a create
5166
+ that sends `clientId` and `clientSecret` here answers 201 without either (and stores
5167
+ `useIClientFields: true` unless `false` is sent).
5114
5168
  examples:
5115
5169
  - 0oa1b2c3d4EXAMPLE5
5116
5170
  clientSecret:
5117
5171
  type: string
5118
5172
  description: |
5119
- OAuth client secret (encrypted at rest).
5120
- Required for "authorizecode" and "clientcredentials" grant types.
5173
+ OAuth client secret (encrypted at rest). Not stored on an `http` connection: the secret
5174
+ belongs on the iClient (see `clientId`).
5121
5175
  writeOnly: true
5122
5176
  examples:
5123
5177
  - cs_abc123EXAMPLE456secret
@@ -5333,9 +5387,11 @@ components:
5333
5387
  - "authorizecode" — Authorization Code flow (browser-based user consent).
5334
5388
  Requires authURI, tokenURI, and user authorization via browser.
5335
5389
  - "clientcredentials" — Client Credentials flow (server-to-server, no user).
5336
- Requires tokenURI, clientId, clientSecret.
5390
+ Requires tokenURI.
5337
5391
  - "password" — Resource Owner Password flow (username/password exchange).
5338
- Requires tokenURI, username, password, clientId, clientSecret.
5392
+ Requires tokenURI, username, password.
5393
+ - On an `http` connection the client ID and secret are never stored here: a
5394
+ `custom_oauth2` iClient referenced by `http._iClientId` supplies them.
5339
5395
  JWT:
5340
5396
  type: object
5341
5397
  description: |-
@@ -9560,7 +9616,7 @@ components:
9560
9616
  connection's traffic counts against the referenced connection's limit instead of its own,
9561
9617
  and its own concurrency and auto-recovery settings have no effect. One level only: the
9562
9618
  referenced connection may not itself borrow, and a connection that others borrow from
9563
- cannot start borrowing.
9619
+ cannot start borrowing. A connection cannot reference itself (422).
9564
9620
  examples:
9565
9621
  - 615dfa0742763671275b70ab
9566
9622
  x-celigo-ai-guidance: