@celigo/api-specs 0.2.209 → 0.2.211

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
@@ -1468,6 +1468,9 @@ components:
1468
1468
  - exported_to_netsuite
1469
1469
  Webhook:
1470
1470
  type: object
1471
+ required:
1472
+ - verify
1473
+ x-celigo-ui-override: 'verify is required by the webhook listener form for every provider (exports/webhook.js: verify required:true; on a connector-backed listener the form pre-fills it from the connector definition before saving). The API enforces it only when provider is custom or absent — 422 missing_required_field on webhook.verify, "verify is required for export type webhook, provider = custom". For the named providers probed (slack, shopify, github) it stores a listener posted with key and no verify (201 each; the GET carries provider, key and formType simple) and requires a credential instead: without key (and no token) each answers 422 missing_required_field on webhook.key — "key is required for slack verification" / "key is required for shopify verification" / "key is required for github verification"; a slack listener posted with token and no key saved. Other named providers are unprobed. The requirement is kept so an authored document matches a form-saved one.'
1471
1474
  description: Configuration for webhook listeners that receive data through incoming HTTP requests. Required when the export's `type` is `webhook`; omit for other export types. Senders POST to the export's listener URL, `https://api.integrator.io/v1/exports/{_id}/data` (or the same path on the account's regional API host); the platform validates each request using the configured `verify` method, passes the payload to subsequent flow steps, and returns a configurable HTTP response to the caller. A request is answered 204 by default when accepted, 401 when it fails verification, and 403 `unable_to_run_flows` while every flow the export feeds is disabled; a refused request is not queued, so the sender must resend it.
1472
1475
  x-celigo-ai-guidance:
1473
1476
  - Configuration object for real-time event listeners that receive data via incoming HTTP requests.
@@ -1542,7 +1545,7 @@ components:
1542
1545
  properties:
1543
1546
  provider:
1544
1547
  type: string
1545
- description: Source application sending the webhook, used to pre-configure security settings and payload parsing for that platform. Use `custom` (the default when omitted) for unlisted providers or when you need full manual control over the security configuration. Provider-specific choices may require credentials (tokens, keys) mandated by that platform.
1548
+ description: 'Source application sending the webhook. A named provider labels the listener and opens it in the Simple form view, where the form pre-fills that platform''s verification settings and payload parsing before saving; the API itself stores the document as sent and fills nothing in. Use `custom` (the default when omitted) for unlisted providers or when you need full manual control over the security configuration. A named provider requires a credential: `key` for the providers probed (shopify, github, slack — and slack also saves with `token` alone); the HMAC settings a provider''s form pre-fills are the form''s, not an API requirement (see the guidance below).'
1546
1549
  x-celigo-ai-guidance:
1547
1550
  - |-
1548
1551
  Specifies the source application sending webhook data,
@@ -1553,10 +1556,18 @@ components:
1553
1556
  This field determines how the webhook handles incoming requests:
1554
1557
 
1555
1558
  - OPTIONAL: Defaults to "custom" if not specified
1556
- - When a specific provider is selected, the system:
1557
- 1. Pre-configures appropriate security settings for that platform
1558
- 2. Applies platform-specific payload parsing rules
1559
- 3. May enable additional features only relevant to that provider
1559
+ - A named provider labels the listener, picks its form view (`formType`
1560
+ defaults to `simple`) and makes a credential required — probed for
1561
+ `slack`, `shopify` and `github`: without `key` (and no `token`) each
1562
+ fails with 422 missing_required_field on `webhook.key`, "key is required
1563
+ for slack verification" / "key is required for shopify verification" /
1564
+ "key is required for github verification"; a `slack` listener posted
1565
+ with `token` and no `key` saved. It does NOT make the API fill in
1566
+ `verify` and its companions — a document sent to the API stores exactly
1567
+ what it carries, and the listener form fills them from the connector
1568
+ definition before saving. Send them when the stored document should
1569
+ match a form-saved one (Slack: `verify: hmac`, `algorithm: sha256`,
1570
+ `encoding: base64`, `header: X-Slack-Signature`).
1560
1571
  - |-
1561
1572
  ## IMPLEMENTATION GUIDANCE
1562
1573
 
@@ -1566,9 +1577,10 @@ components:
1566
1577
  ```
1567
1578
  "provider": "shopify"
1568
1579
  ```
1569
- - Automatically configures proper HMAC verification settings
1570
- - Optimizes payload parsing for Shopify's webhook format
1571
- - May enable additional Shopify-specific features
1580
+ - Labels the listener as Shopify's and opens it in the Simple form view
1581
+ - Requires `key` (422 "key is required for shopify verification"); saves
1582
+ without `verify` and its companions, which the form would have filled in —
1583
+ send them for a document that matches a form-saved one
1572
1584
 
1573
1585
  ### Custom configuration
1574
1586
 
@@ -1584,7 +1596,7 @@ components:
1584
1596
 
1585
1597
  Choose a specific provider when:
1586
1598
  - The source system is explicitly listed in the enum values
1587
- - You want to leverage pre-configured settings
1599
+ - You want the form's pre-filled verification settings for that platform
1588
1600
  - The integration must follow platform-specific practices
1589
1601
 
1590
1602
  Choose "custom" when:
@@ -1631,7 +1643,7 @@ components:
1631
1643
  shopify: Shopify store event webhooks with HMAC-SHA256 verification.
1632
1644
  travis: Travis CI build event webhooks (travis-ci.com).
1633
1645
  travis-org: Travis CI build event webhooks (travis-ci.org).
1634
- slack: Slack workspace event webhooks with token verification.
1646
+ slack: Slack workspace event webhooks. The Simple form pre-fills HMAC-SHA256 over the `X-Slack-Signature` header with the app's signing secret as `key`; the API itself accepts either `key` or `token` as the credential (probed 2026-10-29) and pre-fills nothing.
1635
1647
  dropbox: Dropbox file change notification webhooks.
1636
1648
  onfleet: Onfleet delivery management event webhooks.
1637
1649
  helpscout: Help Scout customer support event webhooks.
@@ -1673,13 +1685,19 @@ components:
1673
1685
  Which webhook export form the UI uses to edit this listener. A value sent on create or
1674
1686
  update wins (case-insensitive — `Simple` is stored as `simple`); a PUT that omits it
1675
1687
  keeps the stored value, and a new export without one gets the default for its
1676
- `provider`. Every webhook export GET carries it.
1677
- examples:
1678
- - webhook
1688
+ `provider`. Every webhook export GET carries it. The view changes nothing at run time:
1689
+ the listener URL, the verification and the flows are the same in both.
1690
+ x-celigo-ai-guidance:
1691
+ - |-
1692
+ Omit it on create — the API stamps the provider's default (`simple` for a named
1693
+ provider, `webhook` for `custom`), with or without `_httpConnectorId`, and keeps a
1694
+ value the user set by hand. The legacy UI values `http` / `assistant` fail with 422
1695
+ `enum`, and the field is not PATCH-whitelisted (422 "not a whitelisted property"):
1696
+ change it through a full save.
1679
1697
  verify:
1680
1698
  type: string
1681
1699
  x-celigo-ui-override: Required by the webhook export form (verify is required:true). Encoded to mirror the form so builders produce connectable configurations.
1682
- description: 'Verification method applied to every incoming request before processing; required for all webhook exports. Each method needs companion fields: `hmac` requires `key`, `algorithm`, `encoding`, and `header` (except on connector-backed webhooks, where the connector definition supplies them); `token` requires `token`, with `tokenLocation` defaulting to `body` and selecting which location-specific field applies; `basic` requires `username` and `password`; `secret_url` requires `token`. Prefer `hmac` when the source system supports it — it is the most secure option; `secret_url` relies only on URL obscurity and suits non-sensitive data or testing.'
1700
+ description: 'Verification method applied to every incoming request before processing; required for all webhook exports. Each method needs companion fields: `hmac` requires `key`, `algorithm`, `encoding`, and `header` (on connector-backed webhooks the form does not require them — it fills them from the connector definition before saving; the API itself copies nothing); `token` requires `token`, with `tokenLocation` defaulting to `body` and selecting which location-specific field applies; `basic` requires `username` and `password`; `secret_url` requires `token`. Prefer `hmac` when the source system supports it — it is the most secure option; `secret_url` relies only on URL obscurity and suits non-sensitive data or testing.'
1683
1701
  x-celigo-ai-guidance:
1684
1702
  - |-
1685
1703
  ## FIELD BEHAVIOR
@@ -2123,6 +2141,32 @@ components:
2123
2141
  format: objectId
2124
2142
  x-celigo-refModel: httpconnectors
2125
2143
  description: HTTP connector backing this listener when the webhook is provided by an assistant/connector (e.g. Slack); set by the platform for connector-backed listeners.
2144
+ x-celigo-ai-guidance:
2145
+ - |-
2146
+ The save stores the document as sent and copies nothing from the connector: a
2147
+ listener posted with only `provider`, `key` and (optionally) `_httpConnectorId`
2148
+ saves with no `verify`, `algorithm`, `encoding` or `header` (probed for `slack`
2149
+ and `shopify`) — the API requires a credential for the provider and nothing else:
2150
+ without `key` (and no `token`) `slack`, `shopify` and `github` each fail with 422
2151
+ missing_required_field on `webhook.key` ("key is required for slack verification" /
2152
+ "key is required for shopify verification" / "key is required for github
2153
+ verification"), and a `slack` listener posted with `token` and no `key` saves. The
2154
+ listener form fills the verification fields from the connector's
2155
+ `supportedBy.export.preConfiguredFields` on every save (for Slack `verify: hmac`,
2156
+ `algorithm: sha256`, `encoding: base64`, `header: X-Slack-Signature`); an API
2157
+ caller that wants the stored document to match a form-saved one sends them itself.
2158
+ _httpConnectorApiId:
2159
+ type: string
2160
+ format: objectId
2161
+ x-celigo-refModel: httpconnectorapis
2162
+ description: API of a multi-API connector (an entry of the connector's `apis[]`) this listener is bound to — the form's API type, offered in the Simple view; omit for single-API connectors and universal webhooks.
2163
+ examples:
2164
+ - 673702e2f367e6469401dcf6
2165
+ x-celigo-ai-guidance:
2166
+ - |-
2167
+ Stored and echoed as sent on create and GET; a value that is not an ObjectId fails
2168
+ the save with 422 `invalid_field` ("Invalid value … for field
2169
+ 'webhook._httpConnectorApiId'. Reason: BSONError.").
2126
2170
  requestMediaType:
2127
2171
  type: string
2128
2172
  enum:
package/dist/import.yml CHANGED
@@ -4286,13 +4286,13 @@ components:
4286
4286
  jsonPath:
4287
4287
  type: string
4288
4288
  description: |
4289
- JSONPath into the source record that selects the
4290
- data feeding this subrecord. Semantics depend
4289
+ JSONPath from the source record root that selects
4290
+ the data feeding this subrecord. Semantics depend
4291
4291
  on placement:
4292
4292
  * Line-level (on `lists[].fields[].`
4293
- `subRecordMapping`) — often `$` to reuse
4294
- the enclosing sublist line's row, or a path
4295
- into a nested array on that row.
4293
+ `subRecordMapping`) — the array of lines the
4294
+ sublist iterates (`lineItems`); `$` only when
4295
+ each record is itself one line.
4296
4296
  * Body-level (on `fields[].subRecordMapping`)
4297
4297
  — a path into the source record root.
4298
4298
  Defaults to `$`.
@@ -4484,9 +4484,10 @@ components:
4484
4484
  type: boolean
4485
4485
  description: |-
4486
4486
  When true, this field is a key for matching the record's existing sublist lines: a
4487
- mapped line updates the one existing line whose key fields hold the same values. `lists`
4488
- says which records match lines, the keys used when no field sets `isKey`, and what a
4489
- line that matches no line, or several, does.
4487
+ mapped line updates the one existing line whose key fields hold the same values —
4488
+ every key field must match, so several keys narrow the match. `lists` says which
4489
+ records match lines, the keys used when no field sets `isKey`, and what a line that
4490
+ matches no line, or several, does.
4490
4491
  immutable:
4491
4492
  type: boolean
4492
4493
  description: When true, this field is only set on record creation, not on updates.
@@ -4565,13 +4566,19 @@ components:
4565
4566
  jsonPath:
4566
4567
  type: string
4567
4568
  description: |
4568
- JSONPath (relative to the current sublist
4569
- line) to the rows that populate the
4570
- subrecord. Typically `$` when the
4571
- subrecord data is carried on the same
4572
- line item (iteration over the sublist
4573
- has already selected the line).
4574
- Defaults to `$`.
4569
+ Path from the source record root to the
4570
+ array of lines whose elements feed this
4571
+ subrecord — the same array the sublist
4572
+ iterates (`lineItems`, `items`); the n-th
4573
+ element populates the n-th sublist line.
4574
+ `$` only when each source record is itself
4575
+ one line. Defaults to `$`.
4576
+ x-celigo-ai-guidance:
4577
+ - |-
4578
+ `$` on a record whose lines sit under a field renders no subrecord for any
4579
+ line, and NetSuite rejects the first numbered line with `Please configure the
4580
+ inventory detail in line N of the item list`; name the line array
4581
+ (`lineItems`), never the current-line context.
4575
4582
  mapping:
4576
4583
  type: object
4577
4584
  description: |
@@ -4682,6 +4689,11 @@ components:
4682
4689
  with `MULTIPLE_LINES_WITH_SAME_KEYS` ("Multiple lines found with keys item=<value> ..."). A
4683
4690
  line that matches none is added as a new line, which an item fulfillment's `item` sublist
4684
4691
  refuses with `SSS_INVALID_SUBLIST_OPERATION`: its lines are its order's.
4692
+
4693
+ On a fulfillment created from an order, a kit's lot-, serial- or bin-managed components are
4694
+ lines of their own under the kit's line, each with its own `line` and `orderline` (the
4695
+ component's own order line) and `kitmemberof` holding the kit line's id; the inventory detail
4696
+ belongs on those component lines, and a kit line refuses it.
4685
4697
  x-celigo-ai-guidance:
4686
4698
  - |-
4687
4699
  To make an update replace a sublist's lines, also map the body field
@@ -4696,6 +4708,24 @@ components:
4696
4708
  field, or, on a fulfillment, the order line's id mapped to `orderline`. Keying on the item fails
4697
4709
  with `MULTIPLE_LINES_WITH_SAME_KEYS` when an order holds the same item on two lines, and records
4698
4710
  that already hold repeated lines fail the same way once a key is set.
4711
+ - |-
4712
+ A key field is read from the existing lines, never written, so a read-only field keys as well
4713
+ as a writable one. The mapper's "Items : Line ID" is `line` (the fulfillment's own line number,
4714
+ equal to the order line only on a fresh full transform) and "Items : Line Number" is `linenum`;
4715
+ `orderline` and `kitmemberof` are not in its picker — type `item[*].orderline` /
4716
+ `item[*].kitmemberof` as the destination.
4717
+ - |-
4718
+ Kit components on a fulfillment: the item is the only default key that reaches a component
4719
+ line, so a component two kit lines share fails with `MULTIPLE_LINES_WITH_SAME_KEYS`. Keying the
4720
+ component rows on the KIT's order line (`line` or `orderline`) selects the kit line instead and
4721
+ the save fails with `You cannot create an inventory detail for this item`. When the source
4722
+ carries the kit's order line on its component rows, keep the item as a key and add
4723
+ `item[*].kitmemberof` mapped from that line id as a second key, keep the kit rows in the list
4724
+ (their empty `kitmemberof` matches the kit line) with `item[*].celigo_ignore_current_line_invdetail_subrecord`
4725
+ true so no inventory detail is written on them, and build the inventory detail from each
4726
+ component row's own picks; component rows alone leave every kit line unfulfilled (`You must
4727
+ enter at least one line item for this transaction`). When the source can supply each
4728
+ component line's own order line id, key every row on `orderline` instead.
4699
4729
  x-celigo-agent:
4700
4730
  - mapping
4701
4731
  lookups:
@@ -8999,14 +9029,33 @@ components:
8999
9029
  x-enumDescriptions:
9000
9030
  pgp: Encrypt the file with PGP before it is written.
9001
9031
  description: |-
9002
- Encrypts the output file; omit it for an unencrypted file. `pgp` requires
9003
- `pgp.symmetricKeyAlgorithm` and a connection holding the recipient's public key
9004
- (`pgp.publicKey`) — without either the save fails with 422 `missing_required_field`.
9005
- The public-key check runs first: on a connection without one, any `encrypt` value,
9006
- `false` included, fails with 422 `missing_required_field` "pgp publicKey is required
9007
- when encrypt is selected to perform file encryption." before the value is checked.
9008
- Blob (file-transfer) imports follow the same rule and return `encrypt` and `pgp` even
9009
- without `file.type`.
9032
+ Encrypts the file before it reaches the destination — a file generated from records
9033
+ or, on a `blob: true` transfer, the existing file being moved; omit it for an
9034
+ unencrypted file. `pgp` requires `pgp.symmetricKeyAlgorithm` and a connection holding
9035
+ the recipient's public key (`pgp.publicKey`). Not observed in a run here; per the file
9036
+ adaptor's code (IO-213945, the `blob: true` transfer path): with no `compressionFormat`,
9037
+ a file over 200 MB fails the record before encryption with `pgp_file_size_exceeded`
9038
+ ("The file size exceeds the maximum limit of 200 MB supported for PGP encryption." —
9039
+ the adaptor's `errorStore.js` text); with `compressionFormat` set the adaptor skips that
9040
+ pre-check (the compressed size is not known up front) and the encryption service
9041
+ enforces its own 200 MB limit on the compressed file (`S3_FILE_SIZE_EXCEEDED`); a key
9042
+ the platform cannot use fails with the PGP service's own code (`PGP_PUBLICKEY_INVALID` /
9043
+ `PGP_PRIVATEKEY_INVALID` — "<operation> failed because the <key> is invalid."), and
9044
+ `encryption_error` ("error in encrypting the file") only when the service returns no
9045
+ code; the file is never written in clear and a transfer's encryption failure is not
9046
+ retried automatically. A file generated from records meets the same encryption-service
9047
+ limit with `S3_FILE_SIZE_EXCEEDED`.
9048
+ x-celigo-ui-override: 'The transfer forms for FTP, S3, the on-premise file system and the cloud file providers (Box, Dropbox, Google Drive, Azure Blob Storage, Google Cloud Storage, Azure Data Lake Storage Gen2, Celigo file storage) offer the Encrypt files control in both modes (imports/subForms/fileAdvanced.js: ''pgpencrypt'' visible for inputMode records and blob, disabled until the connection holds a PGP key). The connection-side PGP section (connections/subForms/fileAdvanced.js) is mounted by ftp.js, s3.js, filesystem.js, celigoapis.ts, tp.js and the Box / Dropbox / Google Drive / Azure storage account custom HTTP forms; the Google Cloud Storage (httpFramework.js) and ADLS Gen2 (http.js) connection forms do not mount it, so on those two the key is set through the API. The AS2, VAN and NetSuite file cabinet import forms do not carry the control.'
9049
+ x-celigo-ai-guidance:
9050
+ - |-
9051
+ Without `pgp.symmetricKeyAlgorithm` the save fails with 422 `missing_required_field` on
9052
+ `file.pgp.symmetricKeyAlgorithm`; on a connection without `pgp.publicKey` it fails with
9053
+ 422 `missing_required_field` on `file.encrypt` ("pgp publicKey is required when encrypt
9054
+ is selected to perform file encryption."), and that check runs first, for any value.
9055
+ - |-
9056
+ `true` and `false` are rejected with 422 `enum` — the field is the string `pgp`, never a
9057
+ boolean. Blob transfers follow the same save rules and return `encrypt` and `pgp` on
9058
+ reads even without `file.type`.
9010
9059
  csv:
9011
9060
  type: object
9012
9061
  description: CSV-specific configuration. Only used when `type` is `"csv"`.
@@ -9278,10 +9327,16 @@ components:
9278
9327
  sha384: SHA-384 signing hash.
9279
9328
  sha512: SHA-512 signing hash.
9280
9329
  sha224: SHA-224 signing hash.
9281
- description: Hash algorithm used when signing the encrypted file; set only when the recipient requires a specific one.
9330
+ description: Hash algorithm used when signing the encrypted file; set only when the recipient requires a signature, which also needs the connection's `pgp.privateKey` and `pgp.passphrase`.
9282
9331
  examples:
9283
9332
  - sha256
9284
9333
  - sha512
9334
+ x-celigo-ai-guidance:
9335
+ - |-
9336
+ On a connection without `pgp.privateKey` the save fails with 422
9337
+ `missing_required_field` on `file.pgp.hashAlgorithm` ("pgp privateKey is required
9338
+ when hashAlgorithm is selected to perform file signature."); leave it unset unless
9339
+ the connection holds the private key.
9285
9340
  skipRename:
9286
9341
  type: boolean
9287
9342
  description: |-
@@ -4891,26 +4891,36 @@ components:
4891
4891
  PGP:
4892
4892
  type: object
4893
4893
  description: |-
4894
- PGP encryption settings for file-based connections (ftp, s3, and similar). When set, files are
4895
- PGP-encrypted before upload and/or decrypted after download. Supply at least one of `publicKey`
4896
- (to encrypt outbound files) or `privateKey` (to decrypt inbound files); set `passphrase` whenever
4897
- `privateKey` is provided.
4894
+ PGP keys and options for the file transports — `ftp`, `s3`, the on-premise file system and the
4895
+ cloud file-provider connections such as Box, Dropbox, Google Drive, Azure Blob Storage and
4896
+ Celigo file storage. `publicKey` encrypts the files the connection's imports write,
4897
+ record-generated files and transferred (blob) files alike; `privateKey` with its `passphrase`
4898
+ decrypts the files its exports read and signs encrypted output. Supply at least one of the two.
4898
4899
  properties:
4899
4900
  publicKey:
4900
4901
  type: string
4901
4902
  description: |-
4902
- ASCII-armored PGP public key used to encrypt outbound files before upload.
4903
- Set this when the connection sends encrypted files; omit it for decrypt-only connections.
4903
+ ASCII-armored PGP public key of the recipient, used to encrypt every file an import on this
4904
+ connection writes with `file.encrypt: pgp`; omit it for decrypt-only connections. Returned
4905
+ in clear on reads.
4904
4906
  x-celigo-ai-guidance:
4905
4907
  - |-
4906
- Public key for JWT verification. Optional — used when the API requires
4907
- the public key to be registered for signature verification.
4908
+ An import on this connection cannot save `file.encrypt: pgp` without it — the save fails
4909
+ with 422 `missing_required_field` on `file.encrypt` ("pgp publicKey is required when
4910
+ encrypt is selected to perform file encryption."); the import form disables its Encrypt
4911
+ files control until the connection holds a key.
4908
4912
  privateKey:
4909
4913
  type: string
4910
4914
  writeOnly: true
4911
4915
  description: |-
4912
4916
  ASCII-armored PGP private key used to decrypt inbound files after download (encrypted at rest;
4913
- returned masked as `"******"`). Set this when the connection receives encrypted files.
4917
+ returned masked as `"******"`). Set this when the connection receives encrypted files, or
4918
+ when its imports sign what they encrypt (`file.pgp.hashAlgorithm`).
4919
+ x-celigo-ai-guidance:
4920
+ - |-
4921
+ Signing needs it: an import that sets `file.pgp.hashAlgorithm` on a connection without a
4922
+ private key fails to save with 422 `missing_required_field` on `file.pgp.hashAlgorithm`
4923
+ ("pgp privateKey is required when hashAlgorithm is selected to perform file signature.").
4914
4924
  passphrase:
4915
4925
  type: string
4916
4926
  writeOnly: true
@@ -6692,10 +6702,11 @@ components:
6692
6702
  retryHeader:
6693
6703
  type: string
6694
6704
  description: |
6695
- HTTP response header name that contains the retry delay (in seconds) when rate-limited.
6696
-
6697
- Defaults to "Retry-After" which is the HTTP standard. Only change this if the API
6698
- uses a non-standard header name for retry-after values.
6705
+ Response header the retry reads for its wait once a response has been recognized
6706
+ as rate-limited — a delay in seconds or an HTTP date. It only sets the wait: a
6707
+ response carrying the header is not treated as throttled unless a status, header
6708
+ or body rule under `rateLimit` matches it. Change it only when the API names its
6709
+ retry-after header differently.
6699
6710
  default: Retry-After
6700
6711
  formType:
6701
6712
  type: string
@@ -7425,42 +7436,60 @@ components:
7425
7436
  rateLimit:
7426
7437
  type: object
7427
7438
  description: |
7428
- Rate limiting configuration. Defines how the system detects and handles
7429
- API rate limit responses.
7430
-
7431
- When rate limiting is detected, the system pauses requests and waits for
7432
- the retry-after period before resuming. The retryHeader field on the parent
7433
- HTTP object controls which response header contains the wait time.
7439
+ Rules for recognizing a throttled response. When any rule is set, every response
7440
+ through the connection is checked against the status code, the header rules and
7441
+ the body rule, and the first match marks the request rate-limited; the retry then
7442
+ waits for the header named by the parent `retryHeader` (`Retry-After` by default).
7443
+ A 429 is recognized with no rules at all; a 2xx response is recognized only through
7444
+ a matching `failHeaders` rule or a matching `failPath` + `failValues` pair, which is
7445
+ how APIs that throttle inside a 200 body (GraphQL, Shopify among them) are handled.
7434
7446
  properties:
7435
7447
  failStatusCode:
7436
7448
  type: number
7437
7449
  description: |
7438
- HTTP status code that indicates the API is rate-limiting requests.
7439
- Defaults to 429 (Too Many Requests) which is the HTTP standard.
7440
- Change only if the API uses a non-standard status code for rate limits.
7450
+ Status code that marks a response rate-limited in place of the standard 429.
7451
+ Set it only when the API throttles with another non-success code; a 2xx value
7452
+ does not make successful responses count as throttled on its own.
7441
7453
  default: 429
7442
7454
  failPath:
7443
7455
  type: string
7444
7456
  description: |
7445
- JSON path or XPath to check in response bodies for rate limit indicators.
7446
- Used when APIs return 200 OK but embed rate limit errors in the response body.
7457
+ JSON path or XPath to the body field that carries the API's throttle indicator,
7458
+ for APIs that answer 200 with the error inside the body. Point at the field
7459
+ itself (`errors.0.extensions.code`), not at the array or object around it, and
7460
+ pair it with `failValues`, which supplies the values that mean "throttled".
7447
7461
  examples:
7448
- - errors[0].code
7462
+ - errors.0.extensions.code
7463
+ x-celigo-ai-guidance:
7464
+ - |-
7465
+ Saves on its own (the probe shows a `failPath` with no `failValues` is accepted),
7466
+ and the documented contract recognizes a 200 as throttled only when `failValues`
7467
+ is set as well. For Shopify GraphQL the platform's own example is
7468
+ `errors.0.extensions.code` with `failValues: ["THROTTLED"]`.
7449
7469
  failValues:
7450
7470
  type: array
7451
7471
  items:
7452
7472
  type: string
7453
7473
  description: |
7454
- Values at failPath that indicate rate limiting. Requires failPath to be set.
7474
+ Values at `failPath` that mean the request was throttled; a match on any of them
7475
+ marks the response rate-limited.
7455
7476
  examples:
7456
- - - rate_limit_exceeded
7457
- - too_many_requests
7477
+ - - THROTTLED
7478
+ - MAX_COST_EXCEEDED
7479
+ x-celigo-ai-guidance:
7480
+ - |-
7481
+ Needs `failPath`: `failValues` without it fails the save with 422
7482
+ `dependent_field` ("The field: failValues should not be specified without the
7483
+ field: failPath for the Connection.").
7458
7484
  failHeaders:
7459
7485
  type: array
7460
7486
  description: |
7461
- Response-header rules for detecting rate limiting, each a header `name` with an
7462
- optional `value`. A rule with an empty `name` fails the save with 422
7463
- `invalid_header_format`.
7487
+ Response-header rules for recognizing a throttled response, each a header `name`
7488
+ with an optional `value`. A rule with a `value` matches when the response header
7489
+ carries that value — the stored text is compared with the header as received; a
7490
+ rule with no `value` matches whenever the header is present at all, so a header
7491
+ the API sends on every response (a remaining-quota counter) would mark every
7492
+ response throttled — give such a header a value.
7464
7493
  items:
7465
7494
  type: object
7466
7495
  required:
@@ -7471,18 +7500,32 @@ components:
7471
7500
  description: Response header the rule checks.
7472
7501
  value:
7473
7502
  type: string
7474
- description: Header value the rule checks; omit to check the header alone.
7503
+ description: Header value the rule compares with the response header; omit to match on the header's presence alone. Stored as sent.
7475
7504
  examples:
7476
7505
  - - name: X-RateLimit-Remaining
7477
7506
  value: '0'
7507
+ x-celigo-ai-guidance:
7508
+ - |-
7509
+ A rule without a `name` fails the save with 422 `invalid_header_format`; a rule
7510
+ with a name and no value saves and matches on presence. The value is stored as
7511
+ sent and not validated at save time.
7478
7512
  limit:
7479
7513
  type: number
7480
7514
  minimum: 1
7515
+ x-celigo-ui-override: Semantics mirror the connection form, which labels the field "Wait time between HTTP requests" and requires the value in milliseconds (fieldDefinitions/resources/connection.js 'http.rateLimit.limit').
7481
7516
  description: |
7482
- Maximum number of requests per rate-limit window. When set, the connection's
7483
- effective concurrency level must be 1 to ensure proper rate limit enforcement.
7517
+ Minimum spacing between consecutive requests through the connection, in
7518
+ milliseconds, for APIs that cap request rate rather than concurrency. It only
7519
+ applies when the connection runs one request at a time.
7484
7520
  examples:
7485
7521
  - 1000
7522
+ x-celigo-ai-guidance:
7523
+ - |-
7524
+ Saves only when `concurrencyLevel` is 1 — and, with `autoRecoverRateLimitErrors`
7525
+ on, `targetConcurrencyLevel` is 1 as well; otherwise the save fails with 422
7526
+ `invalid_concurrency_level` ("The field "connection.http.concurrencyLevel"
7527
+ should be set to 1 when the field "connection.http.rateLimit.limit" is
7528
+ populated."). A numeric string is stored as a number.
7486
7529
  headers:
7487
7530
  type: array
7488
7531
  description: |