@celigo/api-specs 0.2.213 → 0.2.215

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/flow.yml CHANGED
@@ -2153,12 +2153,14 @@ paths:
2153
2153
 
2154
2154
  The `data` field is the record as the failing stage held it: for an import-stage error
2155
2155
  (`page_processor_import`) on an HTTP import, the record before the import's mappings, not the
2156
- request the import sent; for a postResponseMap hook's error (`post_response_mapping`), the record
2156
+ request the import sent; for a lookup's error (`page_processor_export`), the record as it reached
2157
+ the lookup; for a postResponseMap hook's error (`post_response_mapping`), the record
2157
2158
  after the step's response mapping. Use `PUT .../{retryDataKey}/data` to mutate
2158
2159
  the snapshot before retrying. Only errors with a `retryDataKey` expose this endpoint;
2159
2160
  connection-class errors are rejected with `no_retrydata_found`. The `stage` field indicates
2160
2161
  where the retry will resume: `page_processor_import` re-runs the import (most common, and where a
2161
- postSubmit hook's errors are stored, so their retry writes the records again),
2162
+ postSubmit hook's errors are stored — a retry writes again a record the destination accepted,
2163
+ and resends one whose refusal the hook reworded), `page_processor_export` re-runs the lookup,
2162
2164
  `post_response_mapping` (a postResponseMap hook's error) resumes after the import from the stored
2163
2165
  reply in `adaptorResponse`, sending nothing to the destination again and carrying the record on
2164
2166
  to the flow's next steps, and `page_generator` means the error was upstream of the processor.
@@ -4342,6 +4344,10 @@ paths:
4342
4344
 
4343
4345
  An empty object `{}` means no other resources depend on the target — this is also returned for a
4344
4346
  well-formatted but nonexistent id.
4347
+
4348
+ A `flows` entry whose `paths` holds `_runNextFlowIds` is an upstream flow: its own
4349
+ `_runNextFlowIds` lists this flow, so this flow starts when a run of that one completes. The
4350
+ flows this flow starts are in its own `_runNextFlowIds`, not in this response.
4345
4351
  parameters:
4346
4352
  - name: _id
4347
4353
  in: path
@@ -4364,7 +4370,7 @@ paths:
4364
4370
  summary: No dependents (also returned for a nonexistent id)
4365
4371
  value: {}
4366
4372
  populated:
4367
- summary: Another flow is configured to run after this one
4373
+ summary: Another flow starts this one when its run completes
4368
4374
  value:
4369
4375
  flows:
4370
4376
  - id: 69f4b2cb95ec28be9ca1a88d
@@ -5847,9 +5853,11 @@ components:
5847
5853
  - string
5848
5854
  - 'null'
5849
5855
  description: |-
5850
- IANA timezone for the schedule (e.g. `America/New_York`). Defaults to UTC. The flow's
5851
- `schedule` and each page generator's own `schedule` are read in this timezone; a page
5852
- generator has no timezone of its own.
5856
+ IANA timezone for the schedule (e.g. `America/New_York`). The flow's `schedule` and each
5857
+ page generator's own `schedule` are read in this timezone; a page generator has no
5858
+ timezone of its own. A flow saved without one stores none, and its schedule then runs in
5859
+ UTC when the account owner's profile has no time zone; per the Help Center's time zone
5860
+ precedence, it runs in the owner's profile time zone when the profile sets one.
5853
5861
  examples:
5854
5862
  - America/New_York
5855
5863
  - Europe/London
@@ -6935,8 +6943,10 @@ components:
6935
6943
  `application` covers the step's whole call to the external system, not only its answer:
6936
6944
  besides errors the destination returned, it marks a request that never got an answer,
6937
6945
  such as a URL template that failed to render (`handlebars_template_parse_error`) or a
6938
- refused connection, so read `code` and `message` with it. `GET /v1/errors/filterMetadata`
6939
- lists the source values the errors filter accepts.
6946
+ refused connection, so read `code` and `message` with it. `post_submit_hook` marks an error
6947
+ a postSubmit hook added or reworded — a destination refusal included — while one the hook
6948
+ passes along unchanged keeps `application`, so it does not mean the destination accepted the
6949
+ record. `GET /v1/errors/filterMetadata` lists the source values the errors filter accepts.
6940
6950
  examples:
6941
6951
  - application
6942
6952
  code:
@@ -7831,7 +7841,8 @@ components:
7831
7841
  (an import's errors, a postSubmit hook's included) it is the incoming record, before the
7832
7842
  import's mappings — not the request body the import sent or the response it got back — and a
7833
7843
  retry maps it again with the import's current mappings, so a mapping fix reaches the retried
7834
- record. At `post_response_mapping` (a postResponseMap hook's error) it is the record after the
7844
+ record. At `page_processor_export` (a lookup's errors) it is the record as it reached the
7845
+ lookup. At `post_response_mapping` (a postResponseMap hook's error) it is the record after the
7835
7846
  step's response mapping, with the mapped fields: a retry neither maps nor sends it again, and
7836
7847
  the destination's reply is in `adaptorResponse`. Shape varies by adaptor.
7837
7848
  additionalProperties: true
@@ -7840,14 +7851,25 @@ components:
7840
7851
  description: |-
7841
7852
  Pipeline stage where the record was when the error occurred, which is where a retry resumes.
7842
7853
  `page_processor_import` is the record as it entered the import, so a retry sends it to the
7843
- destination again; a postSubmit hook's errors are stored here, so retrying them writes records
7844
- the destination already accepted a second time (live, 2026-10-22). `post_response_mapping` is a
7845
- postResponseMap hook's error, raised after the destination answered: a retry runs the hook from
7846
- the stored reply and carries the record on to the flow's next steps, sending nothing to that
7847
- destination again (live, 2026-10-23 and 2026-10-25: the import's request count didn't change,
7848
- and the next import received the retried records).
7854
+ destination again. A postSubmit hook's errors are stored here whether the destination accepted
7855
+ the record or refused it and the hook reworded the refusal (live, 2026-10-30), so neither the
7856
+ stage nor the error's `post_submit_hook` source says whether the record was written: retrying
7857
+ an error the hook raised after the destination accepted the record writes it a second time
7858
+ (live, 2026-10-22), while a reworded refusal is a record the destination did not take.
7859
+ `page_processor_export` is a lookup's error: a retry runs the lookup again as it is configured
7860
+ now (live, 2026-10-30: after the lookup's template was fixed, the retried records succeeded).
7861
+ `post_response_mapping` is a postResponseMap hook's error, raised after the destination
7862
+ answered: a retry runs the hook from the stored reply and carries the record on to the flow's
7863
+ next steps, sending nothing to that destination again (live, 2026-10-23 and 2026-10-25: the
7864
+ import's request count didn't change, and the next import received the retried records).
7865
+ x-celigo-ai-guidance:
7866
+ - |-
7867
+ Before retrying `post_submit_hook` errors, find out whether the destination took each
7868
+ record — the hook's message, or a lookup of the record in the destination — and retry the
7869
+ refusals. A hook error on a record the destination accepted is written again by the retry.
7849
7870
  examples:
7850
7871
  - page_processor_import
7872
+ - page_processor_export
7851
7873
  - post_response_mapping
7852
7874
  - importMappingExtract
7853
7875
  pgExportId:
package/dist/import.yml CHANGED
@@ -15442,12 +15442,16 @@ components:
15442
15442
  - |-
15443
15443
  On a grouped record (the export groups rows, so the record is an
15444
15444
  array) only `create` can author output — build it from the rows with
15445
- `$[0].field`, `$[*].field`, or a `buildArrayHelper` over `$[*]`.
15445
+ `$[0].field`, `$[*].field`, or a `buildArrayHelper` over `$[*]`
15446
+ (`$.rows[0].field` and `$.rows[*]` with `inputContext: envelope`).
15446
15447
  `modify` has no object to overlay onto an array: the record passes
15447
- through untouched and the processor reports success. Either mode
15448
- reshapes the inside of one record; neither changes how many records
15449
- the page carries (that is the export's `preSavePage` hook) or whether
15450
- the export groups at all (that is its grouping setting).
15448
+ through untouched and the processor reports success. Paths written
15449
+ for one object record (`$.field`, an entry `$.lines[*]`) resolve
15450
+ nothing there, so `create` returns `{}` for each record, also with
15451
+ no error (live, 2026-10-30). Either mode reshapes the inside of one
15452
+ record; neither changes how many records the page carries (that is
15453
+ the export's `preSavePage` hook) or whether the export groups at all
15454
+ (that is its grouping setting).
15451
15455
  examples:
15452
15456
  - create
15453
15457
  - modify
@@ -15512,8 +15516,8 @@ components:
15512
15516
  - record
15513
15517
  - envelope
15514
15518
  x-enumDescriptions:
15515
- record: The transform processor evaluates `mappings[].extract` JSONPath against the flat record itself (`$.field`, no `record.` segment) — the default when absent.
15516
- envelope: The transform processor evaluates JSONPath against the wrapped runtime envelope `{record, job, testMode, settings, headers, queryParams}` (file-provider steps also carry `fileMeta`) — record fields need the `record.` segment (`$.record.field`), while `headers` and `queryParams` sit beside `record` (`$.headers['X-Id']`, `$.queryParams.src`).
15519
+ record: The transform processor evaluates `mappings[].extract` JSONPath against the flat record itself (`$.field`, no `record.` segment; a grouped record is the array of rows, `$[0].field`) — the default when absent.
15520
+ envelope: The transform processor evaluates JSONPath against the wrapped runtime envelope `{record, job, testMode, settings, headers, queryParams}` (file-provider steps also carry `fileMeta`) — record fields need the `record.` segment (`$.record.field`), and a grouped record sits under `rows` instead (`$.rows[0].field`), while `headers` and `queryParams` sit beside `record` (`$.headers['X-Id']`, `$.queryParams.src`).
15517
15521
  description: |
15518
15522
  Controls the JSON shape the transformTwoDotZero processor
15519
15523
  evaluates `mappings[].extract` JSONPath values against at
@@ -15529,24 +15533,38 @@ components:
15529
15533
  processor sees the FLAT record as its evaluation root.
15530
15534
  `mappings[].extract` JSONPath MUST anchor directly at
15531
15535
  `$` with NO `record.` segment — e.g. `"$.orderId"`,
15532
- `"$.customer.email"`; PLACEHOLDER extracts use
15536
+ `"$.customer.email"` on an object record, `"$[0].orderId"`
15537
+ on a grouped one; PLACEHOLDER extracts use
15533
15538
  `"$.PLACEHOLDER_<field>"`.
15534
15539
  This is the dominant Celigo idiom and the right choice for new transforms.
15535
15540
  - `envelope`: the processor sees a wrapped object
15536
15541
  `{record: {...}, job, testMode, settings, headers,
15537
15542
  queryParams}` (plus `fileMeta` on file-provider steps).
15538
15543
  `mappings[].extract` JSONPath MUST include the
15539
- `record.` segment for record fields — e.g.
15540
- `"$.record.orderId"` — and reads `headers` and
15544
+ `record.` segment for an object record's fields — e.g.
15545
+ `"$.record.orderId"`; a grouped record sits under `rows`
15546
+ instead (`"$.rows[0].orderId"`) — and reads `headers` and
15541
15547
  `queryParams` beside it (`$.headers['X-Id']`);
15542
15548
  PLACEHOLDER extracts use `"$.record.PLACEHOLDER_<field>"`.
15543
15549
  Pick this only when the transform was authored against
15544
15550
  the envelope shape on purpose.
15545
15551
  - |-
15546
- Handlebars expressions inside `extract`
15547
- (`{{record.field}}`, `{{dateFormat ... record.field}}`)
15548
- ALWAYS reference the `record` root regardless of
15552
+ Handlebars expressions inside `extract` reference the
15553
+ `record` root on an object record (`{{record.field}}`,
15554
+ `{{dateFormat ... record.field}}`) and `rows` on a
15555
+ grouped one (`{{rows.0.field}}`), regardless of
15549
15556
  `inputContext` — only JSONPath anchoring flips.
15557
+ - |-
15558
+ ## Grouped records
15559
+
15560
+ When the export groups rows, each record is an array of
15561
+ rows. In `record` mode JSONPath roots at that array
15562
+ (`$[0].field`, `$[*]`); `envelope` binds it as `rows`,
15563
+ not `record` — `$.rows[0].field`, and an entry
15564
+ `$.rows[*]` whose children read `$.rows.field` — while
15565
+ `$.record[0].field` and `$.record[*]` resolve nothing,
15566
+ with no error (live, 2026-10-30). Handlebars extracts
15567
+ read it as `rows` in both modes (`{{rows.0.field}}`).
15550
15568
  - |-
15551
15569
  In `envelope` mode the output is still a bare record: a
15552
15570
  `modify` transform returns the record with its mapped
@@ -15567,7 +15585,8 @@ components:
15567
15585
  ``mappings[].extract`` JSONPath values MUST anchor
15568
15586
  directly at ``$`` with NO ``record.`` segment — for
15569
15587
  example ``"$.orderId"`` or
15570
- ``"$.customer.email"``. PLACEHOLDER extracts use
15588
+ ``"$.customer.email"`` on an object record, and
15589
+ ``"$[0].orderId"`` on a grouped one. PLACEHOLDER extracts use
15571
15590
  ``"$.PLACEHOLDER_<field>"``. This is the dominant
15572
15591
  Celigo idiom and the right choice for new transforms.
15573
15592
 
@@ -15579,9 +15598,10 @@ components:
15579
15598
  ``record``) — the
15580
15599
  same runtime-context envelope Handlebars / SQL /
15581
15600
  GraphQL templates render against. ``mappings[].extract``
15582
- JSONPath values for record fields MUST include the
15601
+ JSONPath values for an object record's fields MUST include the
15583
15602
  ``record.`` segment — for example ``"$.record.orderId"``
15584
- or ``"$.record.customer.email"`` — while ``headers`` and
15603
+ or ``"$.record.customer.email"``; a grouped record's rows
15604
+ sit under ``rows`` instead (``"$.rows[0].orderId"``) — while ``headers`` and
15585
15605
  ``queryParams`` are read beside it
15586
15606
  (``"$.headers['X-Id']"``). PLACEHOLDER extracts
15587
15607
  use ``"$.record.PLACEHOLDER_<field>"``. Pick this
@@ -15594,8 +15614,9 @@ components:
15594
15614
 
15595
15615
  Handlebars expressions inside ``extract``
15596
15616
  (``{{record.field}}``,
15597
- ``{{dateFormat ... record.field}}``, etc.) ALWAYS
15598
- reference the runtime context's ``record`` root
15617
+ ``{{dateFormat ... record.field}}``, etc.) reference the
15618
+ runtime context's ``record`` root on an object record,
15619
+ and ``rows`` (``{{rows.0.field}}``) on a grouped one,
15599
15620
  regardless of ``inputContext`` — the Handlebars runtime
15600
15621
  always sees the wrapped envelope. Only JSONPath
15601
15622
  behavior flips with this field.
@@ -5121,11 +5121,22 @@ components:
5121
5121
  format: objectId
5122
5122
  x-celigo-refModel: agents
5123
5123
  description: |
5124
- Reference to a Celigo on-premise Agent. Required for connection types that need
5125
- local network or filesystem access (JDBC, filesystem, Oracle RDBMS, and on-premise MongoDB).
5124
+ Reference to a Celigo on-premise Agent. Connection types that need local network or
5125
+ filesystem access (JDBC, filesystem, Oracle RDBMS, and on-premise MongoDB) carry one
5126
+ binding — this agent, or an agent group in `_agentGroupId`; never both.
5126
5127
  The agent establishes a secure tunnel between the on-premise environment and integrator.io.
5127
5128
  examples:
5128
5129
  - 5f8d43a1b9e5a80011a35f2c
5130
+ _agentGroupId:
5131
+ type: string
5132
+ format: objectId
5133
+ x-celigo-refModel: agentgroups
5134
+ description: |-
5135
+ On-premise agent group serving this connection, when one is bound
5136
+ instead of a single `_agentId`. Absent on connections that use a
5137
+ single agent or none.
5138
+ examples:
5139
+ - 6650a1b2c3d4e5f60718293a
5129
5140
  _borrowConcurrencyFromConnectionId:
5130
5141
  type: string
5131
5142
  format: objectId
@@ -7903,8 +7914,10 @@ components:
7903
7914
  x-celigo-ai-guidance:
7904
7915
  - The POST is rejected with 422 if type-specific required fields are missing (see the per-type conditional rules).
7905
7916
  - |-
7906
- For Oracle, a placeholder connection cannot be created without a real connection-level _agentId
7907
- (validator error agent_mode_only) — direct the user to install a Celigo Agent first. All other
7917
+ For Oracle, a placeholder connection cannot be created without a real on-premise binding — a
7918
+ connection-level _agentId, or an agent group through _agentGroupId (validator error
7919
+ agent_mode_only with neither; live-verified that a POST carrying only _agentGroupId is not
7920
+ answered with it) — direct the user to install a Celigo Agent first. All other
7908
7921
  RDBMS types accept placeholder credentials that satisfy the per-type required fields.
7909
7922
  - |-
7910
7923
  Celigo has native support for these database systems:
@@ -7955,16 +7968,17 @@ components:
7955
7968
  `_iClientId` with `basic` auth is rejected. Both types share the
7956
7969
  `mssql` sub-object; `azuresynapse` is cloud-only, and the SQL Server
7957
7970
  connection form offers service-principal auth in Cloud mode only — it
7958
- saves `basic` for an on-premise connection (`_agentId` set).
7959
- - **Oracle** — runs in agent mode only, so requires `_agentId` on the
7960
- parent connection object. Uses `serviceName` instead of `database`.
7971
+ saves `basic` for an on-premise connection (`_agentId` or `_agentGroupId` set).
7972
+ - **Oracle** — runs in agent mode only, so requires an on-premise binding on
7973
+ the parent connection object: `_agentId`, or an agent group's `_agentGroupId`
7974
+ (one of the two, never both). Uses `serviceName` instead of `database`.
7961
7975
  Optionally also takes `serverType` and `instanceName`.
7962
7976
 
7963
7977
  ## PLACEHOLDER / DUMMY RDBMS CONNECTIONS
7964
7978
 
7965
7979
  For Oracle, placeholder connections cannot be created without a real
7966
- `_agentId` — the validator will reject them. Direct the user to install
7967
- a Celigo Agent first. For all other RDBMS types, a placeholder can be
7980
+ `_agentId` or `_agentGroupId` — the validator will reject them. Direct the
7981
+ user to install a Celigo Agent first. For all other RDBMS types, a placeholder can be
7968
7982
  created with dummy credentials matching the rules above.
7969
7983
  x-celigo-ui-override: 'Several requireds mirror the connection form rather than the API: snowflake.warehouse, redshift.clusterIdentifier, redshift.user, and mssql version. The API creates connections without them (live-verified 201), but the form requires them and a functional connection needs them. For mysql, postgresql, and mariadb the form makes password conditional — not required when a full SSL client certificate (ssl.ca, ssl.key, ssl.cert) is supplied instead; the conditional below keeps password required for the common (non-SSL) path, which is the only path the API enforces.'
7970
7984
  required:
@@ -7987,7 +8001,7 @@ components:
7987
8001
  postgresql: PostgreSQL database (default port 5432).
7988
8002
  mssql: Microsoft SQL Server (default port 1433).
7989
8003
  snowflake: Snowflake Data Cloud (requires snowflake.warehouse).
7990
- oracle: Oracle Database; runs in agent mode and requires a connection-level _agentId (default port 1521, uses serviceName instead of database).
8004
+ oracle: Oracle Database; runs in agent mode and requires a connection-level _agentId or _agentGroupId (default port 1521, uses serviceName instead of database).
7991
8005
  bigquery: Google BigQuery; requires service account credentials in the bigquery sub-object.
7992
8006
  redshift: Amazon Redshift — provisioned clusters or Redshift Serverless; authenticates with static access keys or an AWS IAM role iClient (redshift.authType).
7993
8007
  mariadb: MariaDB database (default port 3306).
@@ -8212,7 +8226,7 @@ components:
8212
8226
  iClient — a client secret, or on SQL Server a certificate — and
8213
8227
  `_iClientId` must reference it. The SQL Server connection form
8214
8228
  offers `azure-service-principal` in Cloud mode only and saves
8215
- `basic` for an on-premise connection (`_agentId` set).
8229
+ `basic` for an on-premise connection (`_agentId` or `_agentGroupId` set).
8216
8230
  default: basic
8217
8231
  examples:
8218
8232
  - basic
@@ -8678,9 +8692,9 @@ components:
8678
8692
  422 "Expected field: <field> to be present" if any of the three is missing. database is not
8679
8693
  required; when omitted, set it per operation instead.
8680
8694
  - |-
8681
- For an on-premise MongoDB instance, set the connection-level _agentId (the form's "On-premise"
8682
- mode) so traffic routes through a Celigo Agent. Cloud-reachable instances (including Atlas)
8683
- need no agent.
8695
+ For an on-premise MongoDB instance, bind the connection to one agent (connection-level
8696
+ _agentId) or to one agent group (_agentGroupId) — the form's "On-premise" mode — so traffic
8697
+ routes through a Celigo Agent. Cloud-reachable instances (including Atlas) need no agent.
8684
8698
  - |-
8685
8699
  ## AUTHENTICATION
8686
8700
  Username and password are optional — only required when the MongoDB server has
@@ -9380,8 +9394,8 @@ components:
9380
9394
  description: |-
9381
9395
  Configuration for filesystem connections. Used when the connection type is "filesystem".
9382
9396
  Provides access to directories on a Celigo on-premise Agent's host or mounted network
9383
- drives, so a connection-level `_agentId` is required — cloud-only deployments cannot use
9384
- this type. File-based PGP encryption/decryption is configured through the connection-level
9397
+ drives, so an on-premise binding is required — a connection-level `_agentId`, or an agent
9398
+ group through `_agentGroupId` — and cloud-only deployments cannot use this type. File-based PGP encryption/decryption is configured through the connection-level
9385
9399
  `pgp` object.
9386
9400
  properties:
9387
9401
  ping:
@@ -9427,9 +9441,10 @@ components:
9427
9441
  mounted network drives.
9428
9442
 
9429
9443
  ## AGENT REQUIREMENT
9430
- A Celigo Agent is REQUIRED for filesystem connections (set _agentId on the parent
9431
- connection object). The agent provides the filesystem access — cloud-only
9432
- deployments cannot use this connection type.
9444
+ A Celigo Agent is REQUIRED for filesystem connections: bind the parent connection
9445
+ object to one agent (_agentId) or to one agent group (_agentGroupId) — one of the
9446
+ two, never both. The agent provides the filesystem access — cloud-only deployments
9447
+ cannot use this connection type.
9433
9448
  token:
9434
9449
  type: object
9435
9450
  description: |
@@ -9903,13 +9918,17 @@ components:
9903
9918
  Configuration for JDBC (Java Database Connectivity) connections. Used when the connection
9904
9919
  type is "jdbc". Provides access through Java JDBC drivers to databases not covered by the
9905
9920
  rdbms type — such as NetSuite SuiteAnalytics, Databricks, DB2, and Workday. The driver runs
9906
- on a Celigo on-premise Agent, so most jdbc connections need a connection-level _agentId.
9921
+ on a Celigo on-premise Agent, so most jdbc connections need an on-premise binding — a
9922
+ connection-level _agentId, or an agent group through _agentGroupId.
9907
9923
  x-celigo-ai-guidance:
9908
9924
  - The POST is rejected with 422 if type-specific required fields are missing (see the per-type conditional rules).
9909
9925
  - |-
9910
- The agent and activedirectory types require a real connection-level _agentId: the POST fails with
9911
- 422 "The JDBC connection requires Agent. Expected field: _agentId to be present in the connection
9912
- doc." A placeholder cannot be created without one, so the user should install a Celigo Agent first.
9926
+ The agent and activedirectory types require a real on-premise binding — a connection-level
9927
+ _agentId, or an agent group through _agentGroupId (one of the two, never both; the agent-mode
9928
+ check accepts either — live-verified for both agent and activedirectory: a POST carrying only
9929
+ _agentGroupId is not answered with agent_mode_only): with neither, the POST fails with 422 "The JDBC
9930
+ connection requires Agent. Expected field: _agentId to be present in the connection doc." A
9931
+ placeholder cannot be created without one, so the user should install a Celigo Agent first.
9913
9932
  Other types commonly run on an agent too, but only these two are validator-enforced (live-verified
9914
9933
  celigo-labs-2 2026-06-11).
9915
9934
  x-celigo-ui-override: 'Two activedirectory requireds mirror the connection form rather than the API: password and port (default 389). The API creates an activedirectory connection without them (it auto-defaults port to 389), but the form requires both, so they are encoded to mirror the form. The workday user and password requireds are NOT form overrides — they are enforced by the API itself (POST returns 422 "Expected field: user/password to be present"). Per-type forms also require named entries inside jdbc.properties (netsuitejdbc AccountID + ServerDataSource; db2 AuthScheme; workday tenant/connectionType/authScheme; activedirectory LDAPVersion/BaseDN) — documented in prose since they live in the properties name/value array.'
@@ -1179,8 +1179,10 @@ paths:
1179
1179
  `http.relativeURI`; triple braces insert it unchanged. A `timestamp` with no time zone
1180
1180
  renders in UTC.
1181
1181
 
1182
- A null value, or a field under an object that is null, renders empty here. An HTTP import
1183
- escapes values its own way, at run time and in the import preview: in its JSON body a
1182
+ By default a null value, a field under an object that is null, and a path the data doesn't
1183
+ carry all render empty here. With `rules.strict` true, a path the data doesn't carry or one
1184
+ through a null object fails with 422, while a null or empty value still renders empty. An
1185
+ HTTP import escapes values its own way, at run time and in the import preview: in its JSON body a
1184
1186
  double-brace value that is null, or under a null object, is written as the text `null`
1185
1187
  (triple braces rendered `{{{record.customer.name}}}` empty, whether `customer` or its `name`
1186
1188
  was null); in its relative URI a null field is sent as the text
@@ -1221,6 +1223,21 @@ paths:
1221
1223
  description: Form of the result; `text` returns the rendered string.
1222
1224
  examples:
1223
1225
  - text
1226
+ strict:
1227
+ type: boolean
1228
+ default: false
1229
+ description: |-
1230
+ When true, a path the data doesn't carry, or one through a missing or null
1231
+ object, fails the render with 422 instead of rendering empty: `"poNumber" not
1232
+ defined in the model`, or `not defined in undefined` / `not defined in null`
1233
+ when the object above it is missing or null — the detail a step's
1234
+ `handlebars_template_parse_error` carries. A null or empty value still renders
1235
+ empty.
1236
+ x-celigo-ai-guidance:
1237
+ - |-
1238
+ Render with `strict: true` to check a template's paths against a sample
1239
+ record: by default a misspelled or wrongly rooted path (`{{record.poNumber}}`
1240
+ on a record that carries `po_number`) renders empty with 200.
1224
1241
  options:
1225
1242
  type: object
1226
1243
  description: |-
@@ -1292,6 +1309,16 @@ paths:
1292
1309
  data:
1293
1310
  record:
1294
1311
  name: Smith & Sons
1312
+ strict:
1313
+ summary: Fail on a path the record doesn't carry
1314
+ value:
1315
+ rules:
1316
+ template: '{{record.poNumber}}'
1317
+ resultMode: text
1318
+ strict: true
1319
+ data:
1320
+ record:
1321
+ po_number: '10482'
1295
1322
  static_lookup:
1296
1323
  summary: Resolve an HTTP import's static lookup
1297
1324
  value:
@@ -1352,7 +1379,8 @@ paths:
1352
1379
  '422':
1353
1380
  description: |-
1354
1381
  The template could not be rendered, for example because it calls a helper that does not
1355
- exist ('Missing helper: "first"').
1382
+ exist ('Missing helper: "first"') or, with `rules.strict`, reads a path the data doesn't
1383
+ carry ('"poNumber" not defined in the model').
1356
1384
  content:
1357
1385
  application/json:
1358
1386
  schema:
@@ -518,7 +518,8 @@ components:
518
518
  description: |-
519
519
  Base number of endpoints (distinct connected applications) included with the plan, per
520
520
  environment. Whether the count is taken from endpoints in use or from endpoints invoked
521
- in the billing period depends on the account's pricing model.
521
+ in the billing period depends on the account's pricing model, which the license's `type`
522
+ names.
522
523
  example: 600
523
524
  numAddOnEndpoints:
524
525
  type: integer
@@ -529,7 +530,7 @@ components:
529
530
  description: |-
530
531
  Base flow entitlement included with the plan, per environment. Whether it caps enabled
531
532
  flows or the distinct flows run in a billing period — and whether reaching it blocks or
532
- only notifies — depends on the account's pricing model.
533
+ only notifies — depends on the account's pricing model, which the license's `type` names.
533
534
  example: 80
534
535
  numAddOnFlows:
535
536
  type: integer
@@ -581,9 +582,14 @@ components:
581
582
  the number of environments, prepaid AI balances, and the other non-resource fields —
582
583
  belong to the parent license and are not repeated per environment.
583
584
  - |-
584
- What a flow or endpoint entitlement METERS depends on the account's pricing model
585
- (`type` plus tier generation). Interpret the counts for the plan this account is on
586
- only; do not infer the rule from field names.
585
+ No field names what a flow or endpoint entitlement METERS; the account-level license's
586
+ `type` tells it. A `platform` license meters runs: on `GET /v1/licenseEntitlementUsage`,
587
+ `flowUsage.numEnabled` counts the distinct flows that ran in the billing period and
588
+ `endpointUsage.numConsumed` the endpoints they used, and `GET /v1/historicalMonthlyUsage`
589
+ returns its monthly rows. An `endpoint` license meters enabled resources: its endpoints are
590
+ counted across enabled flows. Neither `endpoint` nor `integrator` licenses store monthly
591
+ usage (that route fails with 500 for them). Interpret the counts for the plan this account
592
+ is on only; do not infer the rule from field names such as `numEnabled`.
587
593
  properties:
588
594
  _id:
589
595
  type: string
@@ -632,8 +638,8 @@ components:
632
638
  - integrationAppChild
633
639
  x-enumDescriptions:
634
640
  integrator: Account-level subscription (legacy integrator pricing model).
635
- platform: Account-level subscription (platform pricing model; the tier name carries the plan generation).
636
- endpoint: Account-level subscription (endpoint pricing model, metered on distinct endpoints).
641
+ platform: Account-level subscription (platform pricing model, metered on flow runs in the billing period; the tier name carries the plan generation).
642
+ endpoint: Account-level subscription (endpoint pricing model, metered on the distinct endpoints enabled flows use).
637
643
  connector: Connector-specific license for an Integration App.
638
644
  integrationApp: Integration App license (parent).
639
645
  integrationAppChild: Integration App child license (inherits from a parent via `_parentId`).