@celigo/api-specs 0.2.169 → 0.2.171

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/ai-agent.yml CHANGED
@@ -1232,7 +1232,7 @@ components:
1232
1232
  x-enumDescriptions:
1233
1233
  text: Free-form text response from the model.
1234
1234
  json_schema: Structured JSON output conforming to a defined schema.
1235
- blob: Binary data output for non-text content.
1235
+ blob: Image generation — the run calls the image generation tool and returns the stored image's `blobKey`, not `_text` or `_json`.
1236
1236
  default: text
1237
1237
  description: Output format type.
1238
1238
  schemaMode:
@@ -1454,11 +1454,6 @@ components:
1454
1454
  an object without a non-empty name fails with a
1455
1455
  missing-required-field error. String entries are the
1456
1456
  legacy form and stay valid.
1457
- allowedPrompts:
1458
- type: array
1459
- description: Specific prompts to allow from the MCP server (used for MCP prompt entries; all if omitted).
1460
- items:
1461
- type: string
1462
1457
  tool:
1463
1458
  type: object
1464
1459
  description: |
@@ -1601,7 +1596,7 @@ components:
1601
1596
  x-enumDescriptions:
1602
1597
  text: Free-form text response from the model.
1603
1598
  json_schema: Structured JSON output conforming to a defined schema.
1604
- blob: Binary data output for non-text content.
1599
+ blob: Image generation — the run returns the stored image's `blobKey`, not `_text` or `_json`.
1605
1600
  default: text
1606
1601
  schemaMode:
1607
1602
  type: string
@@ -1770,11 +1765,6 @@ components:
1770
1765
  description: Display description shown for the tool.
1771
1766
  required:
1772
1767
  - name
1773
- allowedPrompts:
1774
- type: array
1775
- description: Specific prompts to allow from the MCP server (used for MCP prompt entries; all if omitted).
1776
- items:
1777
- type: string
1778
1768
  tool:
1779
1769
  type: object
1780
1770
  description: Reference to a Celigo Tool resource, used when type is "tool".
@@ -4398,192 +4388,6 @@ components:
4398
4388
  - lookupName
4399
4389
  - required:
4400
4390
  - hardCodedValue
4401
- ResponseMapping:
4402
- type: object
4403
- description: |
4404
- Merges fields from a step's response back onto the in-flight record so
4405
- downstream steps can read them. Applies to both lookup steps
4406
- (`type: "export"`) and import steps (`type: "import"`); without it, the
4407
- step's response is discarded after the call.
4408
-
4409
- `fields` and `lists` are plain arrays — exactly the shape GET returns.
4410
-
4411
- Extract paths do NOT read the raw application response — the platform
4412
- wraps every response in a canonical per-record envelope first, and
4413
- extracts evaluate against that envelope:
4414
-
4415
- - **Lookup steps**: `{"statusCode": 200, "data": [<result records>],
4416
- "errors": []}` — `data` holds the records the lookup step returns,
4417
- AFTER the export's own `transform` and output `filter` have run, so
4418
- extracts must start from it and name transformed fields by their
4419
- transformed name: `data[0].name` copies a field of the first result,
4420
- `data` copies the whole result array. A bare result-record field name
4421
- (e.g. `name`) resolves to nothing and merges nothing, and so does the
4422
- raw response path a transform consumed. A lookup that groups its
4423
- results returns each group as an array inside `data`
4424
- (`"data": [[<row>, <row>]]`): `data[0][0].name` (or `data.0.0.name`)
4425
- reads the first row of the first group, and `data[0]` copies the group.
4426
- - **Import steps**: `{"id": "<destination record id>", "statusCode": 200,
4427
- "ignored": false, "errors": [], "_json": <raw destination response>,
4428
- ...<response body fields flattened at the root>}` — use `id` for the
4429
- destination-assigned id and `_json.<path>` (or the flattened
4430
- `<path>`) for fields inside the destination's response body. The full
4431
- envelope (including `id`) is present on real runs and in flow-builder
4432
- previews; flow TEST runs never execute imports, and their envelope is
4433
- built from the import's saved `mockResponse`, or from the placeholder
4434
- `{"id": "1234567890", "mockResponse": "replace me"}` (numbered
4435
- `1234567890-1`, `1234567890-2`, … when a page holds several records)
4436
- — an `extract: "id"` in a test run merges that mock id, never a
4437
- destination record id.
4438
-
4439
- An `extract` may also be a Handlebars expression. It evaluates against
4440
- the same envelope as a plain path, so every path inside `{{ }}` starts
4441
- where the plain paths start — `{{data.0.name}}`,
4442
- `{{#compare data.0.count "==" 1}}yes{{else}}no{{/compare}}`,
4443
- `{{#if data.length}}found{{/if}}` on a lookup; `{{_json.order.id}}` or
4444
- `{{id}}` on an import. Index arrays with dots inside Handlebars
4445
- (`data.0.name` or `data.[0].name`; `data[0].name` renders nothing), and
4446
- expect a string result (`"1"`, `"false"`). There is no `record` object in
4447
- this context: `{{record.<anything>}}` renders nothing. Prefer a plain
4448
- path when the value is simply copied.
4449
- x-celigo-ai-guidance:
4450
- - |-
4451
- Handlebars is allowed in `extract` but only rooted at the envelope —
4452
- `{{data.0.x}}` on a lookup, `{{_json.x}}` / `{{id}}` on an import. The
4453
- `record.` root belongs to import-mapping templates; here every
4454
- `{{record.…}}` form renders nothing, silently, and `{{data[0].x}}`
4455
- (bracket index inside Handlebars) renders nothing too. Use Handlebars
4456
- only for a derived value (a flag, a concatenation); copy values with a
4457
- plain path.
4458
- - |-
4459
- A lookup's `data[]` is the step's output after its `transform` and
4460
- `filter`, so author extracts against the transformed records — never
4461
- against the raw response the transform consumed, and never against a
4462
- saved `mockOutput` as stored (it is the raw response; the transform
4463
- runs on top of it in a test run).
4464
- - |-
4465
- Send `fields` and `lists` as bare arrays, exactly as GET returns them.
4466
- Never wrap either in an object (e.g. `"fields": {"type": [...]}`): the
4467
- API does not reject that shape — it returns 200 and silently persists
4468
- `fields: [null]` / `lists: [{"fields": []}]`, erasing the step's
4469
- response mappings.
4470
- - |-
4471
- responseMapping is fully replaced on PUT: omitting it resets the step
4472
- to empty `{"fields": [], "lists": []}`. Always send the complete
4473
- intended mapping for every step.
4474
- - |-
4475
- To carry several lookup results onto the record, use `extract: "data"`
4476
- (the whole result array) or a `lists` entry whose extracts use
4477
- `data[*].x` — never `data[*].x` in `fields[].extract`, which merges
4478
- nothing: the record simply never gains the field.
4479
- examples:
4480
- - fields:
4481
- - extract: id
4482
- generate: ContactId
4483
- lists: []
4484
- - fields:
4485
- - extract: data[0].customer.name
4486
- generate: customerName
4487
- lists:
4488
- - generate: matchedOrders
4489
- fields:
4490
- - extract: data[*].id
4491
- generate: orderId
4492
- - extract: data[*].total
4493
- generate: amount
4494
- properties:
4495
- fields:
4496
- type: array
4497
- description: |
4498
- Field mappings that copy individual values from the response
4499
- envelope onto the in-flight record.
4500
- items:
4501
- type: object
4502
- properties:
4503
- extract:
4504
- type: string
4505
- x-celigo-agent:
4506
- - handlebars
4507
- description: |
4508
- Path within the canonical response envelope to copy the value
4509
- from, or a Handlebars expression over that same envelope. For
4510
- lookup steps, paths start from the envelope's `data` array
4511
- (`data[0].x` and `data.0.x` are equivalent; `data` alone
4512
- copies every result) — a lookup result field written without
4513
- the `data` prefix resolves to nothing. For import steps, use
4514
- the envelope fields `id`, `statusCode`, `ignored`, `_json.<path>`
4515
- for the raw response body, or the body field itself at the
4516
- envelope root (`orderNumber` and `_json.orderNumber` read the
4517
- same value). A `[*]` wildcard is not honored here — `data[*].x`
4518
- merges nothing; iterate arrays with `lists` instead. Inside
4519
- Handlebars, index with dots (`{{data.0.x}}`, never
4520
- `{{data[0].x}}`) and never use a `record.` root.
4521
- examples:
4522
- - data[0].customer.name
4523
- - data.0.fields.Product Name
4524
- - data
4525
- - id
4526
- - _json.orderNumber
4527
- - '{{#if data.length}}found{{else}}missing{{/if}}'
4528
- generate:
4529
- type: string
4530
- description: |
4531
- Field path on the in-flight record where the extracted value
4532
- is stored, using dot notation for nesting. Downstream steps
4533
- read the value at this path.
4534
- examples:
4535
- - customerName
4536
- - supplierDetails.supplierName
4537
- - netsuite_order_id
4538
- lists:
4539
- type: array
4540
- description: |
4541
- Array mappings that build a target array on the in-flight record
4542
- from an array inside the response envelope — one output item per
4543
- element of the array the item extracts mark with `[*]` (`data[*].x`
4544
- for lookups, `_json.<arrayPath>[*].x` for imports); an empty source
4545
- array yields an empty target array. Not needed for one-to-many
4546
- (fan-out) merge-back, which uses plain field mappings.
4547
- items:
4548
- type: object
4549
- properties:
4550
- generate:
4551
- type: string
4552
- description: |
4553
- Array field created on the in-flight record to hold the
4554
- mapped items.
4555
- examples:
4556
- - orderItems
4557
- - addresses
4558
- - contacts
4559
- fields:
4560
- type: array
4561
- description: |
4562
- Field mappings applied to each item of the source array to
4563
- produce the corresponding target-array item.
4564
- items:
4565
- type: object
4566
- properties:
4567
- extract:
4568
- type: string
4569
- description: |
4570
- Full envelope path to the source value, with `[*]`
4571
- marking the array to iterate — `data[*].productId` for a
4572
- lookup, `_json.items[*].sku` for an import. A path without
4573
- `[*]` (e.g. `statusCode`) repeats the same envelope value
4574
- on every item; an item-relative name (`productId`)
4575
- resolves to nothing and produces empty objects.
4576
- examples:
4577
- - data[*].productId
4578
- - data[*].quantity
4579
- - _json.items[*].sku
4580
- generate:
4581
- type: string
4582
- description: Target field within each mapped array item.
4583
- examples:
4584
- - itemId
4585
- - qty
4586
- - unitPrice
4587
4391
  Filter:
4588
4392
  type: object
4589
4393
  description: |
@@ -5956,8 +5760,14 @@ components:
5956
5760
  mappings:
5957
5761
  allOf:
5958
5762
  - $ref: '#/components/schemas/Mappings'
5959
- responseMapping:
5960
- $ref: '#/components/schemas/ResponseMapping'
5763
+ x-celigo-ai-guidance:
5764
+ - |-
5765
+ The mapped record is the agent's input: its `text` is sent as text, `record` as
5766
+ its JSON, and `files` (`[{name, blobKey}]`, blob keys from earlier in the same
5767
+ flow) as attachments. `conversationHistoryId` (at most 200
5768
+ characters) keeps one conversation per agent and id across runs. A record with
5769
+ none of `text`, `record` or `files` is sent whole, as JSON, so with no mappings a
5770
+ record's own top-level `text`, `record` or `files` field is its only input.
5961
5771
  inputContext:
5962
5772
  type: string
5963
5773
  enum:
@@ -5968,7 +5778,9 @@ components:
5968
5778
  envelope: The agent receives records wrapped in an envelope with metadata.
5969
5779
  description: |-
5970
5780
  Selects the data context that `mappings[].extract` evaluates against. With no
5971
- mappings the agent receives the entire record and `inputContext` is moot. `record`
5781
+ mappings the agent receives the entire record as JSON (or only the record's own
5782
+ top-level `text`, `record` or `files` fields, when it has any) and `inputContext`
5783
+ is moot. `record`
5972
5784
  (the default) extracts against the flat record; `envelope` extracts against the
5973
5785
  runtime envelope, which exposes the record alongside job, settings, and other
5974
5786
  run-time metadata (`$.record.field`, `$.settings.field`, etc.). Same contract as
@@ -6068,6 +5880,13 @@ components:
6068
5880
  _headers:
6069
5881
  type: object
6070
5882
  description: Mock response headers.
5883
+ blobKey:
5884
+ type: string
5885
+ description: |-
5886
+ Mock output of an agent with `blob` output (image generation:
5887
+ `openai.output.format.type` or `litellm.responseFormat.type` set to `blob`),
5888
+ which returns the stored image's key here. Unrelated to the import-level `blob`
5889
+ flag, which agents refuse.
6071
5890
  ResourceResponse:
6072
5891
  type: object
6073
5892
  description: Response
package/dist/audit.yml CHANGED
@@ -49,6 +49,12 @@ paths:
49
49
  exact resource only — to include descendants (e.g. an integration's
50
50
  flows and exports), use `GET /v1/{resourceType}/{_id}/audit` instead.
51
51
  `_resourceId` requires `resourceType` to also be set.
52
+
53
+ Only the account owner and administrators can query the account-wide
54
+ log: manage, monitor and integration-level users get 403, and an API
55
+ token with limited scope gets 401 `token_restricted_access`. Those
56
+ users can still read the history of a resource they can see, through
57
+ `GET /v1/{resourceType}/{_id}/audit`.
52
58
  parameters:
53
59
  - name: limit
54
60
  in: query
@@ -311,7 +317,9 @@ paths:
311
317
  '400':
312
318
  $ref: '#/components/responses/400-bad-request'
313
319
  '401':
314
- $ref: '#/components/responses/401-unauthorized'
320
+ $ref: '#/components/responses/401-unauthorized-or-scoped-token'
321
+ '403':
322
+ $ref: '#/components/responses/403-administrator-only'
315
323
  '422':
316
324
  $ref: '#/components/responses/422-unprocessable-entity'
317
325
  post:
@@ -328,7 +336,8 @@ paths:
328
336
  identical to `GET /v1/audit`.
329
337
 
330
338
  Pagination, sorting, and time bounds stay in the query string — sending
331
- them in the body fails with 400 `invalid_request_body`.
339
+ them in the body fails with 400 `invalid_request_body`. The same callers
340
+ are refused as on `GET /v1/audit`.
332
341
  parameters:
333
342
  - name: limit
334
343
  in: query
@@ -472,7 +481,9 @@ paths:
472
481
  - code: invalid_request_body
473
482
  message: 'The request body should not contain pagination parameter(s): limit. Pagination values (after, before, limit, sort_order, sort_by) must be provided as query parameters. The request body should only contain filter fields.'
474
483
  '401':
475
- $ref: '#/components/responses/401-unauthorized'
484
+ $ref: '#/components/responses/401-unauthorized-or-scoped-token'
485
+ '403':
486
+ $ref: '#/components/responses/403-administrator-only'
476
487
  '422':
477
488
  description: |-
478
489
  A filter value is invalid, a filter that must be an array was sent as
@@ -502,7 +513,9 @@ paths:
502
513
  description: |-
503
514
  Generates a signed URL for downloading a CSV export of audit logs across all
504
515
  documents. The CSV columns are: Time, Source, User, Resource, Name/ID, Action,
505
- Field, Old value, New value, Support.
516
+ Field, Old value, New value, Support. The same callers are refused as on
517
+ `GET /v1/audit`: only the account owner and administrators can export the
518
+ account-wide log.
506
519
 
507
520
  The signed URL expires after 15 minutes. When `hasMore` is true, pass
508
521
  the last CSV row's timestamp as `to` to fetch the next batch.
@@ -686,7 +699,9 @@ paths:
686
699
  signedURL: https://integrator-userdata-delete-30.s3.us-east-1.amazonaws.com/audit/624cb034630.../audit-export.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=900&...
687
700
  hasMore: false
688
701
  '401':
689
- $ref: '#/components/responses/401-unauthorized'
702
+ $ref: '#/components/responses/401-unauthorized-or-scoped-token'
703
+ '403':
704
+ $ref: '#/components/responses/403-administrator-only'
690
705
  '422':
691
706
  $ref: '#/components/responses/422-unprocessable-entity'
692
707
  post:
@@ -766,7 +781,9 @@ paths:
766
781
  schema:
767
782
  $ref: '#/components/schemas/Error'
768
783
  '401':
769
- $ref: '#/components/responses/401-unauthorized'
784
+ $ref: '#/components/responses/401-unauthorized-or-scoped-token'
785
+ '403':
786
+ $ref: '#/components/responses/403-administrator-only'
770
787
  '422':
771
788
  $ref: '#/components/responses/422-unprocessable-entity'
772
789
  /v1/{resourceType}/{_id}/audit:
@@ -1997,6 +2014,65 @@ components:
1997
2014
  errors:
1998
2015
  - code: invalid_request
1999
2016
  message: The request body failed validation.
2017
+ 401-unauthorized-or-scoped-token:
2018
+ description: |-
2019
+ Unauthorized: the request has no valid bearer token (a bare `{message}` body, as on every
2020
+ route), or the token is an API token with limited scope. The account-wide audit query
2021
+ takes only a full-access API token, a personal access token, or a signed-in session; a
2022
+ scoped token is refused with `token_restricted_access` in the standard `{errors: [...]}`
2023
+ envelope.
2024
+ content:
2025
+ application/json:
2026
+ schema:
2027
+ oneOf:
2028
+ - $ref: '#/components/schemas/Error'
2029
+ - type: object
2030
+ description: The auth middleware's bare body for a missing or invalid token.
2031
+ properties:
2032
+ message:
2033
+ type: string
2034
+ description: '`Unauthorized` (no Authorization header) or `Bearer Authentication Failed`.'
2035
+ required:
2036
+ - message
2037
+ examples:
2038
+ scopedToken:
2039
+ summary: An API token scoped to specific resources
2040
+ value:
2041
+ errors:
2042
+ - code: token_restricted_access
2043
+ message: This action is not allowed using API tokens with limited scope.
2044
+ invalidToken:
2045
+ summary: Bearer token invalid or revoked
2046
+ value:
2047
+ message: Bearer Authentication Failed
2048
+ 403-administrator-only:
2049
+ description: |-
2050
+ The caller is a manage, monitor or integration-level user. The account-wide audit log is
2051
+ for the account owner and administrators; other users read one resource's history with
2052
+ `GET /v1/{resourceType}/{_id}/audit` instead.
2053
+ content:
2054
+ application/json:
2055
+ schema:
2056
+ $ref: '#/components/schemas/Error'
2057
+ examples:
2058
+ notAdministrator:
2059
+ value:
2060
+ errors:
2061
+ - code: access_restricted
2062
+ message: The role which you are associated with doesn't have the required permissions to perform the action.
2063
+ 422-unprocessable-entity:
2064
+ description: |
2065
+ Unprocessable entity. The request was well-formed but was unable to be followed due to semantic errors.
2066
+ content:
2067
+ application/json:
2068
+ schema:
2069
+ $ref: '#/components/schemas/Error'
2070
+ examples:
2071
+ default:
2072
+ value:
2073
+ errors:
2074
+ - code: unprocessable_entity
2075
+ message: The request could not be processed due to a semantic error.
2000
2076
  401-unauthorized:
2001
2077
  description: |-
2002
2078
  Unauthorized. The request lacks a valid bearer token, or the provided token
@@ -2031,19 +2107,6 @@ components:
2031
2107
  summary: Bearer token invalid or revoked
2032
2108
  value:
2033
2109
  message: Bearer Authentication Failed
2034
- 422-unprocessable-entity:
2035
- description: |
2036
- Unprocessable entity. The request was well-formed but was unable to be followed due to semantic errors.
2037
- content:
2038
- application/json:
2039
- schema:
2040
- $ref: '#/components/schemas/Error'
2041
- examples:
2042
- default:
2043
- value:
2044
- errors:
2045
- - code: unprocessable_entity
2046
- message: The request could not be processed due to a semantic error.
2047
2110
  404-not-found:
2048
2111
  description: |
2049
2112
  Not found. The requested resource does not exist or is not visible to the caller.
@@ -10113,9 +10113,12 @@ components:
10113
10113
  type: array
10114
10114
  description: |-
10115
10115
  Errors recorded for the record. `source: application` with
10116
- `stage: apiCall` means the request reached the destination and its
10117
- answer was the failure; the destination's response body rides in
10118
- `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 ...").
10119
10122
  items:
10120
10123
  type: object
10121
10124
  properties:
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":