@celigo/api-specs 0.2.108 → 0.2.110

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/export.yml CHANGED
@@ -923,6 +923,22 @@ components:
923
923
  Not a webhook listener feature: on a `webhook` export the platform applies it only within each page, after
924
924
  the request has been paged, and only to adjacent rows — the field is not offered for listeners in the UI.
925
925
  x-celigo-ai-guidance:
926
+ - |-
927
+ Only adjacent rows with equal values merge — on an HTTP export and on a database export
928
+ alike, a row for key A, then key B, then key A again yields three groups. The platform's
929
+ `sortByFields` setting exists on file exports (`file.sortByFields`) and is ignored as a
930
+ top-level field on an HTTP or database export, so those sources must return same-key rows
931
+ already adjacent — on a database export the query's `ORDER BY` is what turns the three
932
+ groups into two.
933
+ - |-
934
+ Not accepted on a NetSuite export: the platform rejects it with `[invalid_config]
935
+ netsuite connection is not supported for groupByFields property`. A NetSuite saved
936
+ search groups through `netsuite.skipGrouping` (the UI's *Group rows*), keyed on the
937
+ record's internal id.
938
+ - |-
939
+ In `POST /v1/exports/preview` the grouped records are the `group` stage that follows
940
+ `parse` (mirrored in top-level `data`); the `parse` stage still holds the ungrouped
941
+ rows, so read `group` when it is present.
926
942
  - |-
927
943
  Never set this on a webhook listener to keep a request's rows together —
928
944
  the listener pages the request's records at ``pageSize`` FIRST and then
@@ -10320,12 +10336,28 @@ components:
10320
10336
  skipGrouping:
10321
10337
  type: boolean
10322
10338
  description: |-
10323
- When true, each result row is processed individually instead of being aggregated with
10324
- related rows. When false or omitted, related rows are grouped before processing.
10339
+ When true, each saved-search result row becomes its own record. When false or omitted,
10340
+ consecutive result rows that share the record's internal id are grouped into one record
10341
+ shaped as an array of rows — the *Group rows* option in the UI.
10325
10342
  x-celigo-ai-guidance:
10343
+ - |-
10344
+ A saved search that returns several rows per record (a sublist or multi-select column)
10345
+ is grouped by leaving this false or omitted: each record arrives as an array of its
10346
+ rows, every row carrying the same internal id as the record's trace key, and the
10347
+ preview reports no duplicate trace keys. With `true` the same search emits one object
10348
+ per row and the repeated internal ids surface as duplicate trace keys
10349
+ (`traceKeysDuplicate` in the preview). Grouping keys on the internal id only — a
10350
+ different key needs a `preSavePage` hook, which sees one page at a time.
10351
+ - |-
10352
+ Celigo's documentation requires the saved search to be sorted by Internal ID for
10353
+ grouping to apply.
10354
+ - |-
10355
+ The generic `groupByFields` setting is not the NetSuite mechanism: the platform rejects
10356
+ it on a NetSuite export with `[invalid_config] netsuite connection is not supported for
10357
+ groupByFields property`.
10326
10358
  - |-
10327
10359
  Set `true` for an ad-hoc RESTlet search (criteria and columns without a saved
10328
- search): grouping needs the search sorted by the grouping key, and an unsorted ad-hoc
10360
+ search): grouping needs the search sorted by internal id, and an unsorted ad-hoc
10329
10361
  search fails with `[search_not_sorted]`.
10330
10362
  - 'For `exportSelect` / `refreshableSelect` dropdowns backed by a NetSuite RESTlet, set `skipGrouping: true`: the UI''s option mapper expects flat per-row results, and the platform otherwise wraps each row in its own grouping list (every option''s `label` then renders as `undefined`).'
10331
10363
  statsOnly:
@@ -44,13 +44,16 @@ paths:
44
44
 
45
45
  Everything that can be checked before running is checked here and answered
46
46
  synchronously, and a rejected submit creates no job: the statement must parse, be
47
- exactly one `SELECT`, use only allow-listed functions, reference files only through
47
+ exactly one `SELECT` (a `DESCRIBE <query>` or `SUMMARIZE <query>` over a storage
48
+ file is accepted as well and returns the column or summary rows), use only
49
+ allow-listed functions, reference files only through
48
50
  bare storage paths or the storage reader functions, and every path must resolve to
49
51
  a file — or a folder of same-format files — the caller can read. A statement that
50
52
  references no file is accepted only when it is a pure constant expression. Supported
51
53
  file formats are CSV/TSV, JSON, NDJSON/JSONL, and Parquet; the reader is chosen from
52
54
  the file's extension (or its MIME type), and an explicit reader function must match
53
- it.
55
+ it. A folder is referenced with a trailing slash and contributes its direct child
56
+ files only; wildcard paths are not supported.
54
57
 
55
58
  Read options are named arguments of the reader call, checked against a per-reader
56
59
  allowlist — for `read_csv`/`read_csv_auto`: `header`, `delim`, `quote`, `escape`,
@@ -186,9 +189,11 @@ paths:
186
189
  file's format (`STORAGE_QUERY_READER_FORMAT_MISMATCH`); a row generator with no
187
190
  file reference (`STORAGE_QUERY_NO_STORAGE_REFERENCE`) or one that would generate
188
191
  more rows than allowed (`STORAGE_QUERY_GENERATOR_TOO_LARGE`); a schema- or
189
- catalog-qualified table name (`STORAGE_QUERY_INVALID_SOURCE`); an unsupported
190
- file type (`STORAGE_QUERY_UNSUPPORTED_FILE_TYPE`); a folder that is empty, mixes
191
- formats, or holds too many files (`STORAGE_QUERY_FOLDER_EMPTY`,
192
+ catalog-qualified table name, or a path carrying a wildcard
193
+ (`STORAGE_QUERY_INVALID_SOURCE`); a folder path without its trailing slash
194
+ (`STORAGE_NOT_A_FILE`) or a file path with one (`STORAGE_ITEM_NOT_FOLDER`); an
195
+ unsupported file type (`STORAGE_QUERY_UNSUPPORTED_FILE_TYPE`); a folder that is
196
+ empty, mixes formats, or holds too many files (`STORAGE_QUERY_FOLDER_EMPTY`,
192
197
  `STORAGE_QUERY_MIXED_FORMAT_FOLDER`, `STORAGE_QUERY_FOLDER_TOO_MANY_FILES`); too
193
198
  many distinct files (`STORAGE_QUERY_TOO_MANY_SOURCES`); or more input bytes than
194
199
  the cap (`STORAGE_QUERY_INPUT_TOO_LARGE`).
@@ -233,6 +238,18 @@ paths:
233
238
  errors:
234
239
  - code: STORAGE_QUERY_NO_STORAGE_REFERENCE
235
240
  message: A query that generates rows must read at least one Celigo Storage file; only constant expressions may omit a file reference
241
+ wildcardPath:
242
+ summary: Wildcard in a storage path
243
+ value:
244
+ errors:
245
+ - code: STORAGE_QUERY_INVALID_SOURCE
246
+ message: FROM target "orders/2026/*.csv" is not a valid Celigo Storage file path
247
+ folderWithoutSlash:
248
+ summary: Folder path missing its trailing slash
249
+ value:
250
+ errors:
251
+ - code: STORAGE_NOT_A_FILE
252
+ message: Storage item "orders/2026" is not a file
236
253
  '429':
237
254
  description: |-
238
255
  Too many submits for this account in the current window
@@ -404,9 +421,12 @@ paths:
404
421
  description: |-
405
422
  Returns one page of a completed job's rows. Pages run from 1 to the job's
406
423
  `pageCount`; omit `page` for the first one and keep requesting `page + 1` while
407
- `hasMore` is true. A completed job that matched nothing has `pageCount` 0 and still
408
- serves page 1 as an empty page, so an empty result set never looks like a bad
409
- request. Rows exist only for a `completed` job: a `queued` or `running` job answers
424
+ `hasMore` is true. A page holds as many whole rows as fit the service's page size,
425
+ which is a byte budget rather than a row count — a result of several hundred
426
+ thousand small rows can arrive as a single page — and no parameter changes it, so a
427
+ caller that must hold a page in memory bounds the result with `LIMIT` in the
428
+ statement. A completed job that matched nothing has `pageCount` 0 and still serves
429
+ page 1 as an empty page, so an empty result set never looks like a bad request. Rows exist only for a `completed` job: a `queued` or `running` job answers
410
430
  409 until it finishes, and a `failed` job answers 409 permanently — read its `error`
411
431
  from the status route instead. Jobs are scoped to the submitting account, and an
412
432
  expired job answers 404. Requires the account's license to include the Storage
@@ -565,21 +585,34 @@ components:
565
585
  description: |-
566
586
  A single `SELECT` statement. Storage files are its tables: write a file or
567
587
  folder path where a table name would go, quoted as an identifier
568
- (`FROM "orders/2026/september.csv"`), or pass the path as the first, literal
569
- argument of a reader function (`read_csv_auto`, `read_csv`, `read_json_auto`,
570
- `read_json`, `read_ndjson_auto`, `read_ndjson`, `read_parquet`) when the file
571
- needs explicit read options. Paths are relative to the account's storage root.
572
- Anything other than one `SELECT` — an `UPDATE`, two statements, a table function
573
- that is not a storage reader, or a function outside the allowlist — is rejected
574
- at submit with a 4xx and creates no job. A statement that references no file is
575
- accepted only when it is a pure constant expression.
588
+ (`FROM "orders/2026/september.csv"`) or as a string literal, or pass the path as
589
+ the first, literal argument of a reader function (`read_csv_auto`, `read_csv`,
590
+ `read_json_auto`, `read_json`, `read_ndjson_auto`, `read_ndjson`, `read_parquet`)
591
+ when the file needs explicit read options. Paths are relative to the account's
592
+ storage root and case-sensitive; a leading `/` is accepted. A folder is
593
+ referenced with a trailing `/` (`FROM "orders/2026/"`) and reads its direct
594
+ child files — not its subfolders — as one table; a folder path without the
595
+ slash is refused at submit with 422 `STORAGE_NOT_A_FILE`, a file path with one
596
+ with 422 `STORAGE_ITEM_NOT_FOLDER`. Wildcards are not supported: a `*` or `?`
597
+ in a path answers 422 `STORAGE_QUERY_INVALID_SOURCE`. Anything other than one
598
+ `SELECT` — an `UPDATE`, two statements, a table function that is not a storage
599
+ reader, or a function outside the allowlist — is rejected at submit with a 4xx
600
+ and creates no job; `DESCRIBE <query>` and `SUMMARIZE <query>` are accepted and
601
+ run as ordinary jobs. A statement that references no file is accepted only when
602
+ it is a pure constant expression.
576
603
  examples:
577
604
  - SELECT customer_id, SUM(total) AS spend FROM "orders/2026/september.csv" GROUP BY customer_id ORDER BY spend DESC LIMIT 100
605
+ - SELECT status, COUNT(*) AS orders FROM "orders/2026/" GROUP BY status
578
606
  x-celigo-ai-guidance:
579
607
  - |-
580
608
  Quote storage paths as identifiers relative to the account root: FROM
581
609
  "folder/file.csv". A path that does not resolve fails the submit with 404
582
610
  STORAGE_QUERY_SOURCE_NOT_FOUND and the response carries no jobId.
611
+ - |-
612
+ End a folder path with a slash — FROM "folder/" — to read its direct child files
613
+ as one table; "folder" without the slash fails the submit with 422
614
+ STORAGE_NOT_A_FILE. Never write a wildcard such as "folder/*.csv": it fails with
615
+ 422 STORAGE_QUERY_INVALID_SOURCE.
583
616
  - |-
584
617
  Put read options inside the SQL as named arguments of the reader call, e.g.
585
618
  read_csv_auto('folder/file.csv', header = true, delim = ';'). An option the reader
@@ -815,9 +848,19 @@ components:
815
848
  type: array
816
849
  description: |-
817
850
  Rows on this page, in the statement's output order. Each row is an object keyed
818
- by column name (see `columns` on the job's status). Integer and boolean columns
819
- arrive as JSON numbers and booleans; `DECIMAL` values arrive as strings so no
820
- precision is lost. Empty on an empty result set.
851
+ by column name (see `columns` on the job's status). `TINYINT`, `SMALLINT`,
852
+ `INTEGER`, `FLOAT`, `DOUBLE` and `BOOLEAN` values arrive as JSON numbers and
853
+ booleans. `BIGINT`, `UBIGINT`, `HUGEINT` and `DECIMAL` values arrive as strings so
854
+ no precision is lost (`"9007199254740993"`, `"1.50"`) — and every whole-number
855
+ column inferred from a CSV, JSON or NDJSON file is `BIGINT`, as are `COUNT`, `SUM`
856
+ over integer columns and the ranking window functions, so those come back as
857
+ strings such as `"40"`. `DATE`, `TIME` and `TIMESTAMP` values arrive as strings
858
+ (`2026-09-01`, `10:00:00`, `2026-09-01 10:00:00`). A list column (`INTEGER[]`,
859
+ `VARCHAR[]` — including a JSON array the reader typed as a list) arrives as a JSON
860
+ array, a `STRUCT` as a JSON object, a `MAP` as an array of `{"key", "value"}`
861
+ pairs, an `INTERVAL` as `{"months", "days", "micros"}` where `months` and `days`
862
+ are numbers and `micros` is a string (`{"months": 0, "days": 1, "micros": "0"}`
863
+ for `INTERVAL 1 DAY`). Empty on an empty result set.
821
864
  items:
822
865
  type: object
823
866
  additionalProperties: true
@@ -826,6 +869,33 @@ components:
826
869
  letter: a
827
870
  num: '2.5'
828
871
  flag: true
872
+ - - customer_id: C001
873
+ orders: '7'
874
+ spend: 1840.5
875
+ - - h: '170141183460469231731687303715884105727'
876
+ l:
877
+ - 1
878
+ - 2
879
+ - 3
880
+ s:
881
+ a: 1
882
+ b: x
883
+ tm: '10:00:00'
884
+ iv:
885
+ months: 0
886
+ days: 1
887
+ micros: '0'
888
+ x-celigo-ai-guidance:
889
+ - |-
890
+ Read the type from columns on the job's status before using a value: a
891
+ COUNT(*) or SUM over an integer column is BIGINT and arrives as the string
892
+ "40", not the number 40. When the consumer needs a JSON number, cast in the
893
+ statement — COUNT(*)::DOUBLE and COUNT(*)::INTEGER both arrive as the number
894
+ 40. A cast to INTEGER fails the job when the BIGINT value is outside the
895
+ 32-bit range: `SELECT 2147483648::INTEGER` fails with
896
+ STORAGE_QUERY_EXECUTION_FAILED ("Type INT64 with value 2147483648 can't be
897
+ cast because the value is out of range for the destination type INT32"), so
898
+ prefer DOUBLE for counts and sums whose size is unknown.
829
899
  responses:
830
900
  401-unauthorized:
831
901
  description: |-
package/dist/tool.yml CHANGED
@@ -25445,6 +25445,22 @@ components:
25445
25445
  Not a webhook listener feature: on a `webhook` export the platform applies it only within each page, after
25446
25446
  the request has been paged, and only to adjacent rows — the field is not offered for listeners in the UI.
25447
25447
  x-celigo-ai-guidance:
25448
+ - |-
25449
+ Only adjacent rows with equal values merge — on an HTTP export and on a database export
25450
+ alike, a row for key A, then key B, then key A again yields three groups. The platform's
25451
+ `sortByFields` setting exists on file exports (`file.sortByFields`) and is ignored as a
25452
+ top-level field on an HTTP or database export, so those sources must return same-key rows
25453
+ already adjacent — on a database export the query's `ORDER BY` is what turns the three
25454
+ groups into two.
25455
+ - |-
25456
+ Not accepted on a NetSuite export: the platform rejects it with `[invalid_config]
25457
+ netsuite connection is not supported for groupByFields property`. A NetSuite saved
25458
+ search groups through `netsuite.skipGrouping` (the UI's *Group rows*), keyed on the
25459
+ record's internal id.
25460
+ - |-
25461
+ In `POST /v1/exports/preview` the grouped records are the `group` stage that follows
25462
+ `parse` (mirrored in top-level `data`); the `parse` stage still holds the ungrouped
25463
+ rows, so read `group` when it is present.
25448
25464
  - |-
25449
25465
  Never set this on a webhook listener to keep a request's rows together —
25450
25466
  the listener pages the request's records at ``pageSize`` FIRST and then
@@ -34425,12 +34441,28 @@ components:
34425
34441
  skipGrouping:
34426
34442
  type: boolean
34427
34443
  description: |-
34428
- When true, each result row is processed individually instead of being aggregated with
34429
- related rows. When false or omitted, related rows are grouped before processing.
34444
+ When true, each saved-search result row becomes its own record. When false or omitted,
34445
+ consecutive result rows that share the record's internal id are grouped into one record
34446
+ shaped as an array of rows — the *Group rows* option in the UI.
34430
34447
  x-celigo-ai-guidance:
34448
+ - |-
34449
+ A saved search that returns several rows per record (a sublist or multi-select column)
34450
+ is grouped by leaving this false or omitted: each record arrives as an array of its
34451
+ rows, every row carrying the same internal id as the record's trace key, and the
34452
+ preview reports no duplicate trace keys. With `true` the same search emits one object
34453
+ per row and the repeated internal ids surface as duplicate trace keys
34454
+ (`traceKeysDuplicate` in the preview). Grouping keys on the internal id only — a
34455
+ different key needs a `preSavePage` hook, which sees one page at a time.
34456
+ - |-
34457
+ Celigo's documentation requires the saved search to be sorted by Internal ID for
34458
+ grouping to apply.
34459
+ - |-
34460
+ The generic `groupByFields` setting is not the NetSuite mechanism: the platform rejects
34461
+ it on a NetSuite export with `[invalid_config] netsuite connection is not supported for
34462
+ groupByFields property`.
34431
34463
  - |-
34432
34464
  Set `true` for an ad-hoc RESTlet search (criteria and columns without a saved
34433
- search): grouping needs the search sorted by the grouping key, and an unsorted ad-hoc
34465
+ search): grouping needs the search sorted by internal id, and an unsorted ad-hoc
34434
34466
  search fails with `[search_not_sorted]`.
34435
34467
  - 'For `exportSelect` / `refreshableSelect` dropdowns backed by a NetSuite RESTlet, set `skipGrouping: true`: the UI''s option mapper expects flat per-row results, and the platform otherwise wraps each row in its own grouping list (every option''s `label` then renders as `undefined`).'
34436
34468
  statsOnly:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@celigo/api-specs",
3
- "version": "0.2.108",
3
+ "version": "0.2.110",
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": "79679bbe",
4
+ "iasCommit": "155f6181",
5
5
  "generatedAt": "2026-10-14"
6
6
  },
7
7
  "roots": {