@celigo/api-specs 0.2.168 → 0.2.170

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/api.yml CHANGED
@@ -5932,6 +5932,14 @@ components:
5932
5932
  Do NOT include the protocol prefix (e.g., use "ftp.example.com", not "sftp://ftp.example.com").
5933
5933
  examples:
5934
5934
  - sftp.example.com
5935
+ x-celigo-ai-guidance:
5936
+ - |-
5937
+ Don't point a connection at this environment's own Celigo file server (its
5938
+ `endpoint.hostname`, with a username ending in `@<identifier>`, the server's own
5939
+ `identifier`): a flow reads those files from Celigo Storage directly, and the save
5940
+ refuses that pairing with 422 `fileserver_loopback_not_supported`. Another
5941
+ environment's file server on the same host, such as a trading partner's, is an
5942
+ ordinary connection.
5935
5943
  port:
5936
5944
  type: number
5937
5945
  description: |
@@ -6055,7 +6063,8 @@ components:
6055
6063
  description: |
6056
6064
  Maximum number of concurrent file transfer operations.
6057
6065
  FTP servers often have low connection limits — keep this value conservative.
6058
- Send no more than the account's licensed maximum (25 standard, 50 with an Environments license).
6066
+ Send no more than the account's licensed maximum, the license's `concurrency` (25 standard,
6067
+ 50 with an Environments license).
6059
6068
  Unlike the rest of the `ftp` object, a `PUT` that omits this field keeps the stored value instead of clearing it.
6060
6069
  minimum: 1
6061
6070
  maximum: 50
@@ -6079,7 +6088,7 @@ components:
6079
6088
  description: |-
6080
6089
  Number of parallel transfer threads for this FTP connection. Must be a
6081
6090
  whole number — decimals are rejected on save. Send no more than the
6082
- account's licensed concurrency maximum. On
6091
+ account's licensed concurrency maximum, the same as for `concurrencyLevel`. On
6083
6092
  save the value is mirrored into `userConcurrencyLevel` (and into
6084
6093
  `userTargetConcurrencyLevel` when auto-recovery of rate-limit errors
6085
6094
  is active with `targetConcurrencyLevel` set); clearing it clears the
@@ -1185,7 +1185,8 @@ paths:
1185
1185
  `POST /v1/connections/{_id}/ping`, with no request body to send. Runs the adaptor's ping
1186
1186
  routine against the connection identified by `_id` to verify its credentials and network
1187
1187
  configuration still work; no data is read, written, or modified. An `http` connection with
1188
- no `http.ping` answers `{code: 200}` without sending any request.
1188
+ no `http.ping` answers `{code: 200}` without sending any request, unless it authorizes with
1189
+ an authorization code and holds no token yet: that one answers `missing_token`.
1189
1190
 
1190
1191
  Inspect the response body, not the HTTP status, to determine the outcome: success and
1191
1192
  adaptor-level failures both return HTTP 200 — success is `{code: 200}`, failures are
@@ -1259,8 +1260,10 @@ paths:
1259
1260
  whichever verb the client supports. Both verbs return HTTP 200 with {code: 200} on
1260
1261
  success and HTTP 200 with {errors: [...]} on adaptor-level failure, so inspect the body,
1261
1262
  not the status code. On an `http` connection, {code: 200} shows reachability only once
1262
- `http.ping` is set: with no ping configured, nothing is sent and the answer is always
1263
- {code: 200}.
1263
+ `http.ping` is set: with no ping configured, nothing is sent and the answer is
1264
+ {code: 200}, or `missing_token` for an authorization-code OAuth connection that holds no
1265
+ token yet. An OAuth connection requests a token only when the target answers 401, so a
1266
+ ping of an endpoint that needs no authentication passes without testing the OAuth setup.
1264
1267
  post:
1265
1268
  x-internal: false
1266
1269
  summary: Ping an existing connection
@@ -1270,8 +1273,11 @@ paths:
1270
1273
  adaptor-specific (HTTP sends the `http.ping` request, RDBMS/JDBC open a driver session,
1271
1274
  MCP issues a tools/list, NetSuite/Salesforce do a token or session validation). An `http`
1272
1275
  connection with no `http.ping` passes with `{code: 200}` without sending any request, so
1273
- the ping proves nothing about it until a ping is configured. The request body is optional
1274
- and ignored.
1276
+ the ping proves nothing about it until a ping is configured; one that authorizes with an
1277
+ authorization code and holds no token yet answers `missing_token` instead. An OAuth
1278
+ connection requests a token only when the target answers 401, so a ping of an endpoint
1279
+ that needs no authentication passes without testing the OAuth setup. The request body
1280
+ is optional and ignored.
1275
1281
 
1276
1282
  Inspect the response body, not the HTTP status, to determine the outcome: success and
1277
1283
  adaptor-level failures both return HTTP 200 — success is `{code: 200}`, failures are
@@ -1383,8 +1389,10 @@ paths:
1383
1389
  - Return connection status and any error details
1384
1390
 
1385
1391
  Exception: an `http` connection with no `http.ping` answers {code: 200} without sending
1386
- any request, so it proves nothing until a ping (ideally one that needs the connection's
1387
- credentials) is configured.
1392
+ any request (or `missing_token`, for an authorization-code OAuth connection that holds no
1393
+ token yet), so it proves nothing until a ping is configured — one that needs the
1394
+ connection's credentials, since an OAuth connection requests a token only when the target
1395
+ answers 401.
1388
1396
  /v1/connections/{_id}/proxy:
1389
1397
  post:
1390
1398
  x-internal: false
@@ -2942,6 +2950,8 @@ paths:
2942
2950
  `/v1/connections/{_id}/oauth2` is an alias that answers identically. The URL's
2943
2951
  `state` token is one-time and expires quickly, so request a fresh one if the flow is
2944
2952
  interrupted, then poll `GET /v1/connections/{_id}` until `needsAuthorization` is `false`.
2953
+ On a connection that uses PKCE (an iClient with `oauth2.pkceCodeChallengeMethod`), each call
2954
+ issues a new `code_challenge`, so send the user to the most recent URL only.
2945
2955
 
2946
2956
  The URL's `redirect_uri` is the account's Celigo callback
2947
2957
  (`https://integrator.io/connection/oauth2callback` on North America), which the provider's
@@ -4780,6 +4790,14 @@ components:
4780
4790
  Do NOT include the protocol prefix (e.g., use "ftp.example.com", not "sftp://ftp.example.com").
4781
4791
  examples:
4782
4792
  - sftp.example.com
4793
+ x-celigo-ai-guidance:
4794
+ - |-
4795
+ Don't point a connection at this environment's own Celigo file server (its
4796
+ `endpoint.hostname`, with a username ending in `@<identifier>`, the server's own
4797
+ `identifier`): a flow reads those files from Celigo Storage directly, and the save
4798
+ refuses that pairing with 422 `fileserver_loopback_not_supported`. Another
4799
+ environment's file server on the same host, such as a trading partner's, is an
4800
+ ordinary connection.
4783
4801
  port:
4784
4802
  type: number
4785
4803
  description: |
@@ -4903,7 +4921,8 @@ components:
4903
4921
  description: |
4904
4922
  Maximum number of concurrent file transfer operations.
4905
4923
  FTP servers often have low connection limits — keep this value conservative.
4906
- Send no more than the account's licensed maximum (25 standard, 50 with an Environments license).
4924
+ Send no more than the account's licensed maximum, the license's `concurrency` (25 standard,
4925
+ 50 with an Environments license).
4907
4926
  Unlike the rest of the `ftp` object, a `PUT` that omits this field keeps the stored value instead of clearing it.
4908
4927
  minimum: 1
4909
4928
  maximum: 50
@@ -4927,7 +4946,7 @@ components:
4927
4946
  description: |-
4928
4947
  Number of parallel transfer threads for this FTP connection. Must be a
4929
4948
  whole number — decimals are rejected on save. Send no more than the
4930
- account's licensed concurrency maximum. On
4949
+ account's licensed concurrency maximum, the same as for `concurrencyLevel`. On
4931
4950
  save the value is mirrored into `userConcurrencyLevel` (and into
4932
4951
  `userTargetConcurrencyLevel` when auto-recovery of rate-limit errors
4933
4952
  is active with `targetConcurrencyLevel` set); clearing it clears the
@@ -10094,9 +10113,12 @@ components:
10094
10113
  type: array
10095
10114
  description: |-
10096
10115
  Errors recorded for the record. `source: application` with
10097
- `stage: apiCall` means the request reached the destination and its
10098
- answer was the failure; the destination's response body rides in
10099
- `message`.
10116
+ `stage: apiCall` marks the import's call to the destination. Usually
10117
+ the destination's answer was the failure, and its response body rides
10118
+ in `message`; but a request the import couldn't build carries the same
10119
+ pair and was never sent, such as a URL template that failed to render
10120
+ (`code: handlebars_template_parse_error`, "Failed to generate request
10121
+ url from template ...").
10100
10122
  items:
10101
10123
  type: object
10102
10124
  properties:
package/dist/enduser.yml CHANGED
@@ -2847,6 +2847,14 @@ components:
2847
2847
  Do NOT include the protocol prefix (e.g., use "ftp.example.com", not "sftp://ftp.example.com").
2848
2848
  examples:
2849
2849
  - sftp.example.com
2850
+ x-celigo-ai-guidance:
2851
+ - |-
2852
+ Don't point a connection at this environment's own Celigo file server (its
2853
+ `endpoint.hostname`, with a username ending in `@<identifier>`, the server's own
2854
+ `identifier`): a flow reads those files from Celigo Storage directly, and the save
2855
+ refuses that pairing with 422 `fileserver_loopback_not_supported`. Another
2856
+ environment's file server on the same host, such as a trading partner's, is an
2857
+ ordinary connection.
2850
2858
  port:
2851
2859
  type: number
2852
2860
  description: |
@@ -2970,7 +2978,8 @@ components:
2970
2978
  description: |
2971
2979
  Maximum number of concurrent file transfer operations.
2972
2980
  FTP servers often have low connection limits — keep this value conservative.
2973
- Send no more than the account's licensed maximum (25 standard, 50 with an Environments license).
2981
+ Send no more than the account's licensed maximum, the license's `concurrency` (25 standard,
2982
+ 50 with an Environments license).
2974
2983
  Unlike the rest of the `ftp` object, a `PUT` that omits this field keeps the stored value instead of clearing it.
2975
2984
  minimum: 1
2976
2985
  maximum: 50
@@ -2994,7 +3003,7 @@ components:
2994
3003
  description: |-
2995
3004
  Number of parallel transfer threads for this FTP connection. Must be a
2996
3005
  whole number — decimals are rejected on save. Send no more than the
2997
- account's licensed concurrency maximum. On
3006
+ account's licensed concurrency maximum, the same as for `concurrencyLevel`. On
2998
3007
  save the value is mirrored into `userConcurrencyLevel` (and into
2999
3008
  `userTargetConcurrencyLevel` when auto-recovery of rate-limit errors
3000
3009
  is active with `targetConcurrencyLevel` set); clearing it clears the
@@ -43,8 +43,9 @@ paths:
43
43
  `startTime` must be within the last 30 days and the span to `endTime` must not exceed 3 days.
44
44
  If `endTime` is omitted, the server defaults it to the current time. Poll
45
45
  `GET /v1/eventreports/{_id}` until `status` is `completed`, then download the CSV via
46
- `GET /v1/eventreports/{_id}/signedURL`. The create response includes `_requestedByUserId`;
47
- subsequent GET responses replace this with the `requestedByUser` object (name + email).
46
+ `GET /v1/eventreports/{_id}/signedURL`; generation can take several minutes. The create
47
+ response includes `_requestedByUserId`; subsequent GET responses replace this with the
48
+ `requestedByUser` object (name + email).
48
49
  requestBody:
49
50
  required: true
50
51
  content:
@@ -94,7 +95,42 @@ paths:
94
95
  '401':
95
96
  $ref: '#/components/responses/401-unauthorized'
96
97
  '422':
97
- $ref: '#/components/responses/422-unprocessable-entity'
98
+ description: |-
99
+ The window is out of bounds -- `startTime` more than 30 days back, `endTime` before
100
+ `startTime`, or a span over 3 days -- or `_flowIds` is empty. No report is created.
101
+ content:
102
+ application/json:
103
+ schema:
104
+ $ref: '#/components/schemas/Error'
105
+ examples:
106
+ span_over_three_days:
107
+ summary: Window longer than 3 days
108
+ value:
109
+ errors:
110
+ - field: endTime
111
+ code: invalid_range
112
+ message: For event report, the time gap between start and end time can't exceed 3 days.
113
+ start_over_thirty_days:
114
+ summary: Start more than 30 days back
115
+ value:
116
+ errors:
117
+ - field: startTime
118
+ code: invalid_starttime
119
+ message: The start time for the event report can't go beyond 30 days.
120
+ end_before_start:
121
+ summary: endTime before startTime
122
+ value:
123
+ errors:
124
+ - field: startTime
125
+ code: invalid_range
126
+ message: The end time can't be before than start time.
127
+ no_flows:
128
+ summary: Empty _flowIds
129
+ value:
130
+ errors:
131
+ - field: type
132
+ code: invalid_flowevents
133
+ message: Please select the flows for which the flow event report needs to be generated.
98
134
  get:
99
135
  x-internal: false
100
136
  operationId: listEventReports
@@ -227,6 +263,10 @@ paths:
227
263
  The URL is valid for approximately 15 minutes. Only works when the report `status` is
228
264
  `completed` -- requesting it in any other status returns 400. If the URL has expired,
229
265
  call this endpoint again to get a fresh one.
266
+
267
+ The file is served with `Content-Encoding: gzip`, so download it with a client that decodes
268
+ it (`curl --compressed`) or gunzip it afterwards. Its columns start `traceKey`, `time`,
269
+ `type`, `timeTaken`, `_flowJobId`.
230
270
  parameters:
231
271
  - name: _id
232
272
  in: path
@@ -670,19 +710,6 @@ components:
670
710
  errors:
671
711
  - code: invalid_request
672
712
  message: The request body failed validation.
673
- 422-unprocessable-entity:
674
- description: |
675
- Unprocessable entity. The request was well-formed but was unable to be followed due to semantic errors.
676
- content:
677
- application/json:
678
- schema:
679
- $ref: '#/components/schemas/Error'
680
- examples:
681
- default:
682
- value:
683
- errors:
684
- - code: unprocessable_entity
685
- message: The request could not be processed due to a semantic error.
686
713
  404-not-found:
687
714
  description: |
688
715
  Not found. The requested resource does not exist or is not visible to the caller.
package/dist/export.yml CHANGED
@@ -6273,9 +6273,12 @@ components:
6273
6273
  request fields are interpreted. When omitted, the standard HTTP form is used.
6274
6274
  x-celigo-ai-guidance:
6275
6275
  - |-
6276
- The value changes only the editor, never the request: the same `http.body` is sent
6277
- identically under `http` and `graph_ql`, and the value can be changed on an existing
6278
- export without touching the body.
6276
+ The value picks the editor and changes one thing in a GraphQL request: under `graph_ql`
6277
+ and `assistant_graphql`, a `variables` member stored as a JSON string is parsed and sent
6278
+ as an object, while under `http` it is sent as the string. A body whose `variables` is
6279
+ already an object goes out unchanged under `graph_ql` and `http`. Live-verified 2026-10-22 with
6280
+ export previews against an echo endpoint: a string `variables` under `graph_ql`,
6281
+ `assistant_graphql` and `http`, and an object `variables` under `graph_ql` and `http`.
6279
6282
  - |-
6280
6283
  The GraphQL form reads `http.body` as the JSON envelope `{"query", "operationName",
6281
6284
  "variables"}` and shows each member in its own editor, recompiling the envelope on save
@@ -6492,9 +6495,15 @@ components:
6492
6495
  XML, etc.).
6493
6496
  - |-
6494
6497
  A GraphQL request is this field holding the stringified JSON envelope `{"query":
6495
- "<document>", "operationName": "...", "variables": ...}` whatever `formType` says;
6496
- `variables` may be an object or a JSON-encoded string, and a templated variables value
6497
- must stay inside a string so the body remains parseable JSON at rest (see `formType`).
6498
+ "<document>", "operationName": "...", "variables": ...}`. `variables` may be an object
6499
+ or a JSON-encoded string, and a string is sent as an object only under the GraphQL
6500
+ form types (see `formType`). Variables with unquoted Handlebars (a number, `null`, an
6501
+ `{{#if}}` block) must be a string so the body remains parseable JSON at rest; string
6502
+ values inside that string sit two JSON levels deep, so write them as
6503
+ `\"{{jsonEncode record.x}}\"` with double braces: a plain `{{record.x}}`, or a
6504
+ triple-brace `jsonEncode`, fails a value holding a quote with 422 `invalid_json`.
6505
+ An object or array there is `{{jsonSerialize record.x}}`, also with double braces;
6506
+ triple braces fail the same way.
6498
6507
  - |-
6499
6508
  You can use handlebars expressions to create dynamic content:
6500
6509
  ```
@@ -7318,7 +7327,7 @@ components:
7318
7327
  - response.records
7319
7328
  lastPageStatusCode:
7320
7329
  type: integer
7321
- description: HTTP status code that signals the last page, replacing the default behavior of treating 404 as the end of pagination. When this status is received, paging stops and the response is not treated as an error. Set only when the API uses a non-404 code (such as 204 or 400) to indicate no more pages.
7330
+ description: 'HTTP status code that signals the last page, replacing the default behavior of treating 404 as the end of pagination. When this status is received (any code but `200` paired with `lastPagePath`), paging stops and the response is not treated as an error. Set it when the API uses a non-404 code (such as 204 or 400) to indicate no more pages, or to `200` together with `lastPagePath` when the last page is an ordinary 200 response: then the response is parsed, its records are kept, and paging stops only when `lastPagePath` matches `lastPageValues`.'
7322
7331
  x-celigo-ai-guidance:
7323
7332
  - Specifies a custom HTTP status code that indicates the last page of results.
7324
7333
  - |-
@@ -7353,36 +7362,45 @@ components:
7353
7362
  - |-
7354
7363
  ## TECHNICAL DETAILS
7355
7364
 
7356
- When this status code is received, the system:
7365
+ When this status code is received (any code but `200` paired with
7366
+ `lastPagePath`), the system:
7357
7367
  - Stops the pagination process
7358
7368
  - Considers the data collection complete
7359
7369
  - Does not treat the response as an error
7360
7370
  - Does not attempt to process any response body
7361
7371
 
7362
7372
  IMPORTANT: Only set this if your API explicitly uses a non-404 status code
7363
- to indicate the end of pagination. Setting this incorrectly could cause
7364
- premature termination of data collection or error handling issues.
7373
+ to indicate the end of pagination, or to `200` with `lastPagePath` (below).
7374
+ Setting this incorrectly could cause premature termination of data
7375
+ collection or error handling issues.
7376
+ - |-
7377
+ `200` is the exception, for an API whose last page is an ordinary 200 response:
7378
+ together with `lastPagePath`, paging stops on the first 200 whose `lastPagePath`
7379
+ value matches `lastPageValues`, and that page's records are kept. Live-verified
7380
+ 2026-10-22 with token paging.
7365
7381
  examples:
7366
7382
  - 204
7367
7383
  - 400
7368
7384
  - 500
7369
7385
  lastPagePath:
7370
7386
  type: string
7371
- description: JSON path to a response-body field that signals the end of pagination, such as a "has more" flag or a cursor that empties on the last page. Must be used with `lastPageValues`, which lists the values at this path that stop paging. If the path does not exist in a response, the condition is not considered met.
7387
+ description: 'JSON path to a response-body field that signals the end of pagination, such as a "has more" flag or a cursor that empties on the last page. Must be used with `lastPageValues`, which lists the values at this path that stop paging. If the path does not exist in a response, the condition is not considered met. With `method: token` the path is read only on a response whose status code equals `lastPageStatusCode`, so pair it with `lastPageStatusCode: 200` for an ordinary last page; with `method: body` it is read on every response.'
7372
7388
  x-celigo-ai-guidance:
7373
7389
  - |-
7374
7390
  ## FIELD BEHAVIOR
7375
7391
 
7376
7392
  - OPTIONAL: Only needed for APIs with field-based pagination completion signals
7377
- - Works with all pagination methods
7393
+ - Accepted on all pagination methods; when it is read depends on the method (see
7394
+ the method note below)
7378
7395
  - Used in conjunction with lastPageValues
7379
7396
  - JSON path notation to a field in the response body
7380
7397
  - |-
7381
7398
  ## IMPLEMENTATION GUIDANCE
7382
7399
 
7383
7400
  This field is used when an API indicates the last page through a field
7384
- in the response body rather than using HTTP status codes. The system
7385
- checks this path in each response to determine if pagination is complete.
7401
+ in the response body rather than using HTTP status codes. Which responses
7402
+ the system checks it on depends on the paging method (see the method note
7403
+ below).
7386
7404
 
7387
7405
  Common patterns include:
7388
7406
 
@@ -7416,8 +7434,19 @@ components:
7416
7434
  "lastPageValues": ["false", "0"]
7417
7435
  ```
7418
7436
 
7419
- IMPORTANT: The path is evaluated against each response using JSON path notation.
7420
- If the path doesn't exist in the response, the condition is not considered met.
7437
+ IMPORTANT: The path is evaluated using JSON path notation, on the responses the
7438
+ method note below describes. If the path doesn't exist in the response, the
7439
+ condition is not considered met.
7440
+ - |-
7441
+ On `method: token` the path is checked only on a response whose status code equals
7442
+ `lastPageStatusCode`. For an API whose last page is an ordinary 200 (a GraphQL
7443
+ `pageInfo.hasNextPage: false`), set `lastPageStatusCode: 200` with it; without that,
7444
+ paging goes on while the token at `path` is non-empty, so a last page that still
7445
+ carries a cursor costs one more request. On `method: body` the path is read on
7446
+ every response, with no status code needed. Live-verified 2026-10-22 against an echo
7447
+ endpoint for `token` (two requests without `lastPageStatusCode`, one with 200) and
7448
+ `body` (stopped on the second response); `page`, `skip` and `url` paging were not
7449
+ verified.
7421
7450
  examples:
7422
7451
  - meta.isLastPage
7423
7452
  - pagination.hasMore
@@ -7841,22 +7870,30 @@ components:
7841
7870
  - '201'
7842
7871
  errorPath:
7843
7872
  type: string
7844
- description: Path to the error message in the response body. The value at this path is included in error logs and error records when the API returns an error.
7873
+ description: Path to the error message in the response body. The value at this path is included in error logs and error records when the API returns an error; without it, the message is the whole response body.
7845
7874
  examples:
7846
7875
  - error.message
7847
7876
  - errorMessage
7848
7877
  - errors[0].detail
7878
+ - errors[0].message
7849
7879
  failPath:
7850
7880
  type: string
7851
- description: Path to a response field that signals failure even when the HTTP status code is 200 — the inverse of `successPath`. Must be used with `failValues`.
7881
+ description: Path to a response field that signals failure even when the HTTP status code is 200 — the inverse of `successPath`. With `failValues`, the response fails when the value there matches one of them; without, when the path holds a truthy value. A path that resolves to an array matches only when the array has exactly one element.
7852
7882
  x-celigo-ai-guidance:
7883
+ - Similar to `successPath` but inverted logic — checks for failure indicators.
7853
7884
  - |-
7854
- Similar to `successPath` but inverted logic — checks for failure indicators.
7855
- Must be used together with `failValues`.
7885
+ A path that resolves to an array matches only when the array has exactly one
7886
+ element. GraphQL APIs usually report a failed query with HTTP 200 and an `errors` array:
7887
+ `failPath: errors` fails the response for one error and lets two or more through,
7888
+ so set `failPath` (and `errorPath`) to `errors[0].message`. Without a fail path the
7889
+ response counts as a success, and an export whose `resourcePath` points into
7890
+ `data` returns zero records with no error. Live-verified 2026-10-22 with export
7891
+ and import previews against an echo endpoint.
7856
7892
  examples:
7857
7893
  - error
7858
7894
  - status
7859
7895
  - result.error
7896
+ - errors[0].message
7860
7897
  failValues:
7861
7898
  type: array
7862
7899
  items:
@@ -10674,8 +10711,9 @@ components:
10674
10711
  Number of records the RESTlet returns per request (default 1000). This, not the
10675
10712
  export's `pageSize`, sizes each NetSuite call; the export keeps requesting until the
10676
10713
  search is exhausted. Larger batches reduce round-trips but raise NetSuite governance
10677
- and memory use per call; tune to the record's size. In a test run or preview the
10678
- request is capped at the export's `pageSize` (default 20) instead.
10714
+ and memory use per call; tune to the record's size. The RESTlet caps a call at 1000,
10715
+ so a larger value acts as 1000. In a test run or preview the request is capped at the
10716
+ export's `pageSize` (default 20) instead.
10679
10717
  examples:
10680
10718
  - 100
10681
10719
  - 200
@@ -10954,8 +10992,9 @@ components:
10954
10992
  type: array
10955
10993
  description: |-
10956
10994
  Search columns the RESTlet returns for each matching record. With a saved search,
10957
- omit this to return the search's own result columns; an ad-hoc search (no
10958
- `searchId`) must list its columns here.
10995
+ the RESTlet returns the search's own result columns followed by any listed here: a
10996
+ list adds columns and never removes one of the search's, so remove a column in the
10997
+ saved search itself. An ad-hoc search (no `searchId`) must list its columns here.
10959
10998
  x-celigo-ai-guidance:
10960
10999
  - |-
10961
11000
  Entries are objects keyed by `name` — `[{"name": "internalid"}, {"name":
package/dist/flow.yml CHANGED
@@ -6637,9 +6637,12 @@ components:
6637
6637
  source:
6638
6638
  type: string
6639
6639
  description: |-
6640
- Step stage or system the error came from, such as `application` (raised from the
6641
- destination's response), `connection`, a hook (`pre_save_page_hook`,
6642
- `post_response_map_hook`) or a filter (`output_filter`). `GET /v1/errors/filterMetadata`
6640
+ Step stage or system the error came from, such as `application`, `connection`, a hook
6641
+ (`pre_save_page_hook`, `post_response_map_hook`) or a filter (`output_filter`).
6642
+ `application` covers the step's whole call to the external system, not only its answer:
6643
+ besides errors the destination returned, it marks a request that never got an answer,
6644
+ such as a URL template that failed to render (`handlebars_template_parse_error`) or a
6645
+ refused connection, so read `code` and `message` with it. `GET /v1/errors/filterMetadata`
6643
6646
  lists the source values the errors filter accepts.
6644
6647
  examples:
6645
6648
  - application
package/dist/import.yml CHANGED
@@ -1572,12 +1572,25 @@ components:
1572
1572
  Use `assistant_graphql` as the default value if there is a connector available
1573
1573
  for the system and the connector supports GraphQL.
1574
1574
  - |-
1575
- The value selects the editor only. Each `http.body[]` entry stays a template STRING — a
1575
+ The value selects the editor and changes one thing in a GraphQL request: under
1576
+ `graph_ql` and `assistant_graphql`, a `variables` member stored as a JSON string is
1577
+ parsed and sent as an object, while under `http` it is sent as the string; an object
1578
+ `variables` goes out unchanged under `graph_ql` and `http`. Live-verified 2026-10-22 with import
1579
+ previews against an echo endpoint: a string `variables` under `graph_ql`,
1580
+ `assistant_graphql` and `http`, and an object `variables` under `graph_ql` and `http`.
1581
+ - |-
1582
+ Each `http.body[]` entry stays a template STRING — a
1576
1583
  stringified `{"query", "operationName", "variables"}` envelope, one per operation for the
1577
1584
  update/create pair (`http.body[0]` / `http.body[1]`); never an object entry, which is stored
1578
1585
  as-is and does not render. The GraphQL form parses that string to show each member in its
1579
1586
  own field and re-stringifies it on save; an entry that is not parseable JSON at rest renders
1580
- those fields empty, so keep templated variables inside a JSON string value.
1587
+ those fields empty, so keep templated variables inside a JSON string value. When
1588
+ `variables` is itself a JSON string, the string values inside it sit two JSON levels
1589
+ deep: write them as `\"{{jsonEncode record.x}}\"` with double braces, because a plain
1590
+ `{{record.x}}`, or a triple-brace `jsonEncode`, fails a record whose value holds a quote
1591
+ with 422 `invalid_json` before the request is sent. An object or array there is
1592
+ `{{jsonSerialize record.x}}`, also with double braces; `{{{jsonSerialize record.x}}}`
1593
+ fails the same way (live-verified 2026-10-22).
1581
1594
  - |-
1582
1595
  Create GraphQL imports on a `graph_ql` connection (or a connector connection bound to its
1583
1596
  GraphQL API): that setup offers the Form view toggle between the GraphQL editor and the
@@ -2394,13 +2407,20 @@ components:
2394
2407
 
2395
2408
  Each entry is a DOT-PATH STRING, or null for an operation
2396
2409
  with no ID path configured. When not specified, the platform
2397
- looks for standard `id` or `_id` fields automatically.
2410
+ looks for standard `id` or `_id` fields automatically. When
2411
+ set, a response with no value at the path fails the record
2412
+ with `missing_id`, quoting the response.
2398
2413
  x-celigo-ai-guidance:
2399
2414
  - |-
2400
2415
  Common LLM mistake:
2401
2416
  splitting a single dot-path like ``"data.id"`` into array segments ``["data",
2402
2417
  "id"]`` — DO NOT do this.
2403
2418
  See the ``response`` object docs above.
2419
+ - |-
2420
+ For a GraphQL mutation, point it at the id only a successful call returns
2421
+ (``["data.customerCreate.customer.id"]``): a 200 that carries top-level ``errors``
2422
+ or the mutation's ``userErrors`` then fails the record with ``missing_id`` instead
2423
+ of counting as written. Live-verified 2026-10-22 against an echo endpoint.
2404
2424
  examples:
2405
2425
  - - id
2406
2426
  - - data.id
@@ -2474,11 +2494,23 @@ components:
2474
2494
  available, set both — the platform evaluates ``successPath``
2475
2495
  first and falls through to ``failPath`` only when the
2476
2496
  success check is inconclusive.
2497
+
2498
+ Without ``failValues``, a truthy value at the path fails
2499
+ the response. A path that resolves to an array matches only
2500
+ when the array has exactly one element.
2501
+ x-celigo-ai-guidance:
2502
+ - |-
2503
+ A GraphQL API usually reports a failed mutation with HTTP 200 and an ``errors`` array, which
2504
+ counts as written when no rule catches it. ``failPath: ["errors"]`` fails the record
2505
+ for one error and lets two or more through; use ``["errors[0].message"]`` with
2506
+ ``errorPath: "errors[0].message"`` so the record fails with the server's message.
2507
+ Live-verified 2026-10-22 with import runs against an echo endpoint.
2477
2508
  examples:
2478
2509
  - - error
2479
2510
  - - success
2480
2511
  - - error
2481
2512
  - error
2513
+ - - errors[0].message
2482
2514
  failValues:
2483
2515
  type: array
2484
2516
  items:
@@ -17547,9 +17579,12 @@ components:
17547
17579
  type: array
17548
17580
  description: |-
17549
17581
  Errors recorded for the record. `source: application` with
17550
- `stage: apiCall` means the request reached the destination and its
17551
- answer was the failure; the destination's response body rides in
17552
- `message`.
17582
+ `stage: apiCall` marks the import's call to the destination. Usually
17583
+ the destination's answer was the failure, and its response body rides
17584
+ in `message`; but a request the import couldn't build carries the same
17585
+ pair and was never sent, such as a URL template that failed to render
17586
+ (`code: handlebars_template_parse_error`, "Failed to generate request
17587
+ url from template ...").
17553
17588
  items:
17554
17589
  type: object
17555
17590
  properties:
@@ -4679,6 +4679,14 @@ components:
4679
4679
  Do NOT include the protocol prefix (e.g., use "ftp.example.com", not "sftp://ftp.example.com").
4680
4680
  examples:
4681
4681
  - sftp.example.com
4682
+ x-celigo-ai-guidance:
4683
+ - |-
4684
+ Don't point a connection at this environment's own Celigo file server (its
4685
+ `endpoint.hostname`, with a username ending in `@<identifier>`, the server's own
4686
+ `identifier`): a flow reads those files from Celigo Storage directly, and the save
4687
+ refuses that pairing with 422 `fileserver_loopback_not_supported`. Another
4688
+ environment's file server on the same host, such as a trading partner's, is an
4689
+ ordinary connection.
4682
4690
  port:
4683
4691
  type: number
4684
4692
  description: |
@@ -4802,7 +4810,8 @@ components:
4802
4810
  description: |
4803
4811
  Maximum number of concurrent file transfer operations.
4804
4812
  FTP servers often have low connection limits — keep this value conservative.
4805
- Send no more than the account's licensed maximum (25 standard, 50 with an Environments license).
4813
+ Send no more than the account's licensed maximum, the license's `concurrency` (25 standard,
4814
+ 50 with an Environments license).
4806
4815
  Unlike the rest of the `ftp` object, a `PUT` that omits this field keeps the stored value instead of clearing it.
4807
4816
  minimum: 1
4808
4817
  maximum: 50
@@ -4826,7 +4835,7 @@ components:
4826
4835
  description: |-
4827
4836
  Number of parallel transfer threads for this FTP connection. Must be a
4828
4837
  whole number — decimals are rejected on save. Send no more than the
4829
- account's licensed concurrency maximum. On
4838
+ account's licensed concurrency maximum, the same as for `concurrencyLevel`. On
4830
4839
  save the value is mirrored into `userConcurrencyLevel` (and into
4831
4840
  `userTargetConcurrencyLevel` when auto-recovery of rate-limit errors
4832
4841
  is active with `targetConcurrencyLevel` set); clearing it clears the
package/dist/state.yml CHANGED
@@ -35,6 +35,10 @@ tags:
35
35
  Values must be non-empty JSON objects or arrays. Bare primitives,
36
36
  `null`, and empty containers (`{}`, `[]`) are rejected.
37
37
 
38
+ Each export, import or integration holds at most 10 keys, and the
39
+ global scope at most 100. A new key past the limit is refused with 422
40
+ `limit_reached`; replacing an existing key still works.
41
+
38
42
  Prefer resource-scoped state over global state when the data belongs
39
43
  to a specific export, import, or integration. State keys are upserted —
40
44
  PUT creates if absent, replaces if present. There is no PATCH; send the
@@ -243,15 +247,25 @@ paths:
243
247
  '422':
244
248
  description: |-
245
249
  The request body is empty, or is an empty container (`{}` or
246
- `[]`).
250
+ `[]`), or the key is new and the account already holds 100 global
251
+ keys.
247
252
  content:
248
253
  application/json:
249
254
  schema:
250
255
  $ref: '#/components/schemas/Error'
251
- example:
252
- errors:
253
- - code: missing_request_body
254
- message: Please send state as request body in the PUT request.
256
+ examples:
257
+ missing_request_body:
258
+ summary: Empty body or empty container
259
+ value:
260
+ errors:
261
+ - code: missing_request_body
262
+ message: Please send state as request body in the PUT request.
263
+ limit_reached:
264
+ summary: The account already holds 100 global keys
265
+ value:
266
+ errors:
267
+ - code: limit_reached
268
+ message: 'Cannot save state, allowed number of states already reached for user : 60f1a2b3c4d5e6f7a8b9c0d1'
255
269
  delete:
256
270
  x-internal: false
257
271
  operationId: deleteGlobalStateKey
@@ -710,15 +724,24 @@ paths:
710
724
  '422':
711
725
  description: |-
712
726
  The request body is empty, or is an empty container (`{}` or
713
- `[]`).
727
+ `[]`), or the key is new and the resource already holds 10 keys.
714
728
  content:
715
729
  application/json:
716
730
  schema:
717
731
  $ref: '#/components/schemas/Error'
718
- example:
719
- errors:
720
- - code: missing_request_body
721
- message: Please send state as request body in the PUT request.
732
+ examples:
733
+ missing_request_body:
734
+ summary: Empty body or empty container
735
+ value:
736
+ errors:
737
+ - code: missing_request_body
738
+ message: Please send state as request body in the PUT request.
739
+ limit_reached:
740
+ summary: The resource already holds 10 keys
741
+ value:
742
+ errors:
743
+ - code: limit_reached
744
+ message: 'Cannot save state, allowed number of states already reached for export : 66a1f2c3b4d5e6f7a8b9c0d1'
722
745
  delete:
723
746
  x-internal: false
724
747
  operationId: deleteResourceStateKey
package/dist/tool.yml CHANGED
@@ -8187,6 +8187,14 @@ components:
8187
8187
  Do NOT include the protocol prefix (e.g., use "ftp.example.com", not "sftp://ftp.example.com").
8188
8188
  examples:
8189
8189
  - sftp.example.com
8190
+ x-celigo-ai-guidance:
8191
+ - |-
8192
+ Don't point a connection at this environment's own Celigo file server (its
8193
+ `endpoint.hostname`, with a username ending in `@<identifier>`, the server's own
8194
+ `identifier`): a flow reads those files from Celigo Storage directly, and the save
8195
+ refuses that pairing with 422 `fileserver_loopback_not_supported`. Another
8196
+ environment's file server on the same host, such as a trading partner's, is an
8197
+ ordinary connection.
8190
8198
  port:
8191
8199
  type: number
8192
8200
  description: |
@@ -8310,7 +8318,8 @@ components:
8310
8318
  description: |
8311
8319
  Maximum number of concurrent file transfer operations.
8312
8320
  FTP servers often have low connection limits — keep this value conservative.
8313
- Send no more than the account's licensed maximum (25 standard, 50 with an Environments license).
8321
+ Send no more than the account's licensed maximum, the license's `concurrency` (25 standard,
8322
+ 50 with an Environments license).
8314
8323
  Unlike the rest of the `ftp` object, a `PUT` that omits this field keeps the stored value instead of clearing it.
8315
8324
  minimum: 1
8316
8325
  maximum: 50
@@ -8334,7 +8343,7 @@ components:
8334
8343
  description: |-
8335
8344
  Number of parallel transfer threads for this FTP connection. Must be a
8336
8345
  whole number — decimals are rejected on save. Send no more than the
8337
- account's licensed concurrency maximum. On
8346
+ account's licensed concurrency maximum, the same as for `concurrencyLevel`. On
8338
8347
  save the value is mirrored into `userConcurrencyLevel` (and into
8339
8348
  `userTargetConcurrencyLevel` when auto-recovery of rate-limit errors
8340
8349
  is active with `targetConcurrencyLevel` set); clearing it clears the
@@ -13378,12 +13387,25 @@ components:
13378
13387
  Use `assistant_graphql` as the default value if there is a connector available
13379
13388
  for the system and the connector supports GraphQL.
13380
13389
  - |-
13381
- The value selects the editor only. Each `http.body[]` entry stays a template STRING — a
13390
+ The value selects the editor and changes one thing in a GraphQL request: under
13391
+ `graph_ql` and `assistant_graphql`, a `variables` member stored as a JSON string is
13392
+ parsed and sent as an object, while under `http` it is sent as the string; an object
13393
+ `variables` goes out unchanged under `graph_ql` and `http`. Live-verified 2026-10-22 with import
13394
+ previews against an echo endpoint: a string `variables` under `graph_ql`,
13395
+ `assistant_graphql` and `http`, and an object `variables` under `graph_ql` and `http`.
13396
+ - |-
13397
+ Each `http.body[]` entry stays a template STRING — a
13382
13398
  stringified `{"query", "operationName", "variables"}` envelope, one per operation for the
13383
13399
  update/create pair (`http.body[0]` / `http.body[1]`); never an object entry, which is stored
13384
13400
  as-is and does not render. The GraphQL form parses that string to show each member in its
13385
13401
  own field and re-stringifies it on save; an entry that is not parseable JSON at rest renders
13386
- those fields empty, so keep templated variables inside a JSON string value.
13402
+ those fields empty, so keep templated variables inside a JSON string value. When
13403
+ `variables` is itself a JSON string, the string values inside it sit two JSON levels
13404
+ deep: write them as `\"{{jsonEncode record.x}}\"` with double braces, because a plain
13405
+ `{{record.x}}`, or a triple-brace `jsonEncode`, fails a record whose value holds a quote
13406
+ with 422 `invalid_json` before the request is sent. An object or array there is
13407
+ `{{jsonSerialize record.x}}`, also with double braces; `{{{jsonSerialize record.x}}}`
13408
+ fails the same way (live-verified 2026-10-22).
13387
13409
  - |-
13388
13410
  Create GraphQL imports on a `graph_ql` connection (or a connector connection bound to its
13389
13411
  GraphQL API): that setup offers the Form view toggle between the GraphQL editor and the
@@ -14200,13 +14222,20 @@ components:
14200
14222
 
14201
14223
  Each entry is a DOT-PATH STRING, or null for an operation
14202
14224
  with no ID path configured. When not specified, the platform
14203
- looks for standard `id` or `_id` fields automatically.
14225
+ looks for standard `id` or `_id` fields automatically. When
14226
+ set, a response with no value at the path fails the record
14227
+ with `missing_id`, quoting the response.
14204
14228
  x-celigo-ai-guidance:
14205
14229
  - |-
14206
14230
  Common LLM mistake:
14207
14231
  splitting a single dot-path like ``"data.id"`` into array segments ``["data",
14208
14232
  "id"]`` — DO NOT do this.
14209
14233
  See the ``response`` object docs above.
14234
+ - |-
14235
+ For a GraphQL mutation, point it at the id only a successful call returns
14236
+ (``["data.customerCreate.customer.id"]``): a 200 that carries top-level ``errors``
14237
+ or the mutation's ``userErrors`` then fails the record with ``missing_id`` instead
14238
+ of counting as written. Live-verified 2026-10-22 against an echo endpoint.
14210
14239
  examples:
14211
14240
  - - id
14212
14241
  - - data.id
@@ -14280,11 +14309,23 @@ components:
14280
14309
  available, set both — the platform evaluates ``successPath``
14281
14310
  first and falls through to ``failPath`` only when the
14282
14311
  success check is inconclusive.
14312
+
14313
+ Without ``failValues``, a truthy value at the path fails
14314
+ the response. A path that resolves to an array matches only
14315
+ when the array has exactly one element.
14316
+ x-celigo-ai-guidance:
14317
+ - |-
14318
+ A GraphQL API usually reports a failed mutation with HTTP 200 and an ``errors`` array, which
14319
+ counts as written when no rule catches it. ``failPath: ["errors"]`` fails the record
14320
+ for one error and lets two or more through; use ``["errors[0].message"]`` with
14321
+ ``errorPath: "errors[0].message"`` so the record fails with the server's message.
14322
+ Live-verified 2026-10-22 with import runs against an echo endpoint.
14283
14323
  examples:
14284
14324
  - - error
14285
14325
  - - success
14286
14326
  - - error
14287
14327
  - error
14328
+ - - errors[0].message
14288
14329
  failValues:
14289
14330
  type: array
14290
14331
  items:
@@ -30946,9 +30987,12 @@ components:
30946
30987
  request fields are interpreted. When omitted, the standard HTTP form is used.
30947
30988
  x-celigo-ai-guidance:
30948
30989
  - |-
30949
- The value changes only the editor, never the request: the same `http.body` is sent
30950
- identically under `http` and `graph_ql`, and the value can be changed on an existing
30951
- export without touching the body.
30990
+ The value picks the editor and changes one thing in a GraphQL request: under `graph_ql`
30991
+ and `assistant_graphql`, a `variables` member stored as a JSON string is parsed and sent
30992
+ as an object, while under `http` it is sent as the string. A body whose `variables` is
30993
+ already an object goes out unchanged under `graph_ql` and `http`. Live-verified 2026-10-22 with
30994
+ export previews against an echo endpoint: a string `variables` under `graph_ql`,
30995
+ `assistant_graphql` and `http`, and an object `variables` under `graph_ql` and `http`.
30952
30996
  - |-
30953
30997
  The GraphQL form reads `http.body` as the JSON envelope `{"query", "operationName",
30954
30998
  "variables"}` and shows each member in its own editor, recompiling the envelope on save
@@ -31165,9 +31209,15 @@ components:
31165
31209
  XML, etc.).
31166
31210
  - |-
31167
31211
  A GraphQL request is this field holding the stringified JSON envelope `{"query":
31168
- "<document>", "operationName": "...", "variables": ...}` whatever `formType` says;
31169
- `variables` may be an object or a JSON-encoded string, and a templated variables value
31170
- must stay inside a string so the body remains parseable JSON at rest (see `formType`).
31212
+ "<document>", "operationName": "...", "variables": ...}`. `variables` may be an object
31213
+ or a JSON-encoded string, and a string is sent as an object only under the GraphQL
31214
+ form types (see `formType`). Variables with unquoted Handlebars (a number, `null`, an
31215
+ `{{#if}}` block) must be a string so the body remains parseable JSON at rest; string
31216
+ values inside that string sit two JSON levels deep, so write them as
31217
+ `\"{{jsonEncode record.x}}\"` with double braces: a plain `{{record.x}}`, or a
31218
+ triple-brace `jsonEncode`, fails a value holding a quote with 422 `invalid_json`.
31219
+ An object or array there is `{{jsonSerialize record.x}}`, also with double braces;
31220
+ triple braces fail the same way.
31171
31221
  - |-
31172
31222
  You can use handlebars expressions to create dynamic content:
31173
31223
  ```
@@ -31991,7 +32041,7 @@ components:
31991
32041
  - response.records
31992
32042
  lastPageStatusCode:
31993
32043
  type: integer
31994
- description: HTTP status code that signals the last page, replacing the default behavior of treating 404 as the end of pagination. When this status is received, paging stops and the response is not treated as an error. Set only when the API uses a non-404 code (such as 204 or 400) to indicate no more pages.
32044
+ description: 'HTTP status code that signals the last page, replacing the default behavior of treating 404 as the end of pagination. When this status is received (any code but `200` paired with `lastPagePath`), paging stops and the response is not treated as an error. Set it when the API uses a non-404 code (such as 204 or 400) to indicate no more pages, or to `200` together with `lastPagePath` when the last page is an ordinary 200 response: then the response is parsed, its records are kept, and paging stops only when `lastPagePath` matches `lastPageValues`.'
31995
32045
  x-celigo-ai-guidance:
31996
32046
  - Specifies a custom HTTP status code that indicates the last page of results.
31997
32047
  - |-
@@ -32026,36 +32076,45 @@ components:
32026
32076
  - |-
32027
32077
  ## TECHNICAL DETAILS
32028
32078
 
32029
- When this status code is received, the system:
32079
+ When this status code is received (any code but `200` paired with
32080
+ `lastPagePath`), the system:
32030
32081
  - Stops the pagination process
32031
32082
  - Considers the data collection complete
32032
32083
  - Does not treat the response as an error
32033
32084
  - Does not attempt to process any response body
32034
32085
 
32035
32086
  IMPORTANT: Only set this if your API explicitly uses a non-404 status code
32036
- to indicate the end of pagination. Setting this incorrectly could cause
32037
- premature termination of data collection or error handling issues.
32087
+ to indicate the end of pagination, or to `200` with `lastPagePath` (below).
32088
+ Setting this incorrectly could cause premature termination of data
32089
+ collection or error handling issues.
32090
+ - |-
32091
+ `200` is the exception, for an API whose last page is an ordinary 200 response:
32092
+ together with `lastPagePath`, paging stops on the first 200 whose `lastPagePath`
32093
+ value matches `lastPageValues`, and that page's records are kept. Live-verified
32094
+ 2026-10-22 with token paging.
32038
32095
  examples:
32039
32096
  - 204
32040
32097
  - 400
32041
32098
  - 500
32042
32099
  lastPagePath:
32043
32100
  type: string
32044
- description: JSON path to a response-body field that signals the end of pagination, such as a "has more" flag or a cursor that empties on the last page. Must be used with `lastPageValues`, which lists the values at this path that stop paging. If the path does not exist in a response, the condition is not considered met.
32101
+ description: 'JSON path to a response-body field that signals the end of pagination, such as a "has more" flag or a cursor that empties on the last page. Must be used with `lastPageValues`, which lists the values at this path that stop paging. If the path does not exist in a response, the condition is not considered met. With `method: token` the path is read only on a response whose status code equals `lastPageStatusCode`, so pair it with `lastPageStatusCode: 200` for an ordinary last page; with `method: body` it is read on every response.'
32045
32102
  x-celigo-ai-guidance:
32046
32103
  - |-
32047
32104
  ## FIELD BEHAVIOR
32048
32105
 
32049
32106
  - OPTIONAL: Only needed for APIs with field-based pagination completion signals
32050
- - Works with all pagination methods
32107
+ - Accepted on all pagination methods; when it is read depends on the method (see
32108
+ the method note below)
32051
32109
  - Used in conjunction with lastPageValues
32052
32110
  - JSON path notation to a field in the response body
32053
32111
  - |-
32054
32112
  ## IMPLEMENTATION GUIDANCE
32055
32113
 
32056
32114
  This field is used when an API indicates the last page through a field
32057
- in the response body rather than using HTTP status codes. The system
32058
- checks this path in each response to determine if pagination is complete.
32115
+ in the response body rather than using HTTP status codes. Which responses
32116
+ the system checks it on depends on the paging method (see the method note
32117
+ below).
32059
32118
 
32060
32119
  Common patterns include:
32061
32120
 
@@ -32089,8 +32148,19 @@ components:
32089
32148
  "lastPageValues": ["false", "0"]
32090
32149
  ```
32091
32150
 
32092
- IMPORTANT: The path is evaluated against each response using JSON path notation.
32093
- If the path doesn't exist in the response, the condition is not considered met.
32151
+ IMPORTANT: The path is evaluated using JSON path notation, on the responses the
32152
+ method note below describes. If the path doesn't exist in the response, the
32153
+ condition is not considered met.
32154
+ - |-
32155
+ On `method: token` the path is checked only on a response whose status code equals
32156
+ `lastPageStatusCode`. For an API whose last page is an ordinary 200 (a GraphQL
32157
+ `pageInfo.hasNextPage: false`), set `lastPageStatusCode: 200` with it; without that,
32158
+ paging goes on while the token at `path` is non-empty, so a last page that still
32159
+ carries a cursor costs one more request. On `method: body` the path is read on
32160
+ every response, with no status code needed. Live-verified 2026-10-22 against an echo
32161
+ endpoint for `token` (two requests without `lastPageStatusCode`, one with 200) and
32162
+ `body` (stopped on the second response); `page`, `skip` and `url` paging were not
32163
+ verified.
32094
32164
  examples:
32095
32165
  - meta.isLastPage
32096
32166
  - pagination.hasMore
@@ -32514,22 +32584,30 @@ components:
32514
32584
  - '201'
32515
32585
  errorPath:
32516
32586
  type: string
32517
- description: Path to the error message in the response body. The value at this path is included in error logs and error records when the API returns an error.
32587
+ description: Path to the error message in the response body. The value at this path is included in error logs and error records when the API returns an error; without it, the message is the whole response body.
32518
32588
  examples:
32519
32589
  - error.message
32520
32590
  - errorMessage
32521
32591
  - errors[0].detail
32592
+ - errors[0].message
32522
32593
  failPath:
32523
32594
  type: string
32524
- description: Path to a response field that signals failure even when the HTTP status code is 200 — the inverse of `successPath`. Must be used with `failValues`.
32595
+ description: Path to a response field that signals failure even when the HTTP status code is 200 — the inverse of `successPath`. With `failValues`, the response fails when the value there matches one of them; without, when the path holds a truthy value. A path that resolves to an array matches only when the array has exactly one element.
32525
32596
  x-celigo-ai-guidance:
32526
- - |-
32527
- Similar to `successPath` but inverted logic — checks for failure indicators.
32528
- Must be used together with `failValues`.
32597
+ - Similar to `successPath` but inverted logic — checks for failure indicators.
32598
+ - |-
32599
+ A path that resolves to an array matches only when the array has exactly one
32600
+ element. GraphQL APIs usually report a failed query with HTTP 200 and an `errors` array:
32601
+ `failPath: errors` fails the response for one error and lets two or more through,
32602
+ so set `failPath` (and `errorPath`) to `errors[0].message`. Without a fail path the
32603
+ response counts as a success, and an export whose `resourcePath` points into
32604
+ `data` returns zero records with no error. Live-verified 2026-10-22 with export
32605
+ and import previews against an echo endpoint.
32529
32606
  examples:
32530
32607
  - error
32531
32608
  - status
32532
32609
  - result.error
32610
+ - errors[0].message
32533
32611
  failValues:
32534
32612
  type: array
32535
32613
  items:
@@ -35347,8 +35425,9 @@ components:
35347
35425
  Number of records the RESTlet returns per request (default 1000). This, not the
35348
35426
  export's `pageSize`, sizes each NetSuite call; the export keeps requesting until the
35349
35427
  search is exhausted. Larger batches reduce round-trips but raise NetSuite governance
35350
- and memory use per call; tune to the record's size. In a test run or preview the
35351
- request is capped at the export's `pageSize` (default 20) instead.
35428
+ and memory use per call; tune to the record's size. The RESTlet caps a call at 1000,
35429
+ so a larger value acts as 1000. In a test run or preview the request is capped at the
35430
+ export's `pageSize` (default 20) instead.
35352
35431
  examples:
35353
35432
  - 100
35354
35433
  - 200
@@ -35627,8 +35706,9 @@ components:
35627
35706
  type: array
35628
35707
  description: |-
35629
35708
  Search columns the RESTlet returns for each matching record. With a saved search,
35630
- omit this to return the search's own result columns; an ad-hoc search (no
35631
- `searchId`) must list its columns here.
35709
+ the RESTlet returns the search's own result columns followed by any listed here: a
35710
+ list adds columns and never removes one of the search's, so remove a column in the
35711
+ saved search itself. An ad-hoc search (no `searchId`) must list its columns here.
35632
35712
  x-celigo-ai-guidance:
35633
35713
  - |-
35634
35714
  Entries are objects keyed by `name` — `[{"name": "internalid"}, {"name":
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@celigo/api-specs",
3
- "version": "0.2.168",
3
+ "version": "0.2.170",
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": "80cddc9b",
4
+ "iasCommit": "f57db462",
5
5
  "generatedAt": "2026-10-22"
6
6
  },
7
7
  "roots": {