@celigo/api-specs 0.2.208 → 0.2.210

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/tool.yml CHANGED
@@ -7503,26 +7503,36 @@ components:
7503
7503
  PGP:
7504
7504
  type: object
7505
7505
  description: |-
7506
- PGP encryption settings for file-based connections (ftp, s3, and similar). When set, files are
7507
- PGP-encrypted before upload and/or decrypted after download. Supply at least one of `publicKey`
7508
- (to encrypt outbound files) or `privateKey` (to decrypt inbound files); set `passphrase` whenever
7509
- `privateKey` is provided.
7506
+ PGP keys and options for the file transports — `ftp`, `s3`, the on-premise file system and the
7507
+ cloud file-provider connections such as Box, Dropbox, Google Drive, Azure Blob Storage and
7508
+ Celigo file storage. `publicKey` encrypts the files the connection's imports write,
7509
+ record-generated files and transferred (blob) files alike; `privateKey` with its `passphrase`
7510
+ decrypts the files its exports read and signs encrypted output. Supply at least one of the two.
7510
7511
  properties:
7511
7512
  publicKey:
7512
7513
  type: string
7513
7514
  description: |-
7514
- ASCII-armored PGP public key used to encrypt outbound files before upload.
7515
- Set this when the connection sends encrypted files; omit it for decrypt-only connections.
7515
+ ASCII-armored PGP public key of the recipient, used to encrypt every file an import on this
7516
+ connection writes with `file.encrypt: pgp`; omit it for decrypt-only connections. Returned
7517
+ in clear on reads.
7516
7518
  x-celigo-ai-guidance:
7517
7519
  - |-
7518
- Public key for JWT verification. Optional — used when the API requires
7519
- the public key to be registered for signature verification.
7520
+ An import on this connection cannot save `file.encrypt: pgp` without it — the save fails
7521
+ with 422 `missing_required_field` on `file.encrypt` ("pgp publicKey is required when
7522
+ encrypt is selected to perform file encryption."); the import form disables its Encrypt
7523
+ files control until the connection holds a key.
7520
7524
  privateKey:
7521
7525
  type: string
7522
7526
  writeOnly: true
7523
7527
  description: |-
7524
7528
  ASCII-armored PGP private key used to decrypt inbound files after download (encrypted at rest;
7525
- returned masked as `"******"`). Set this when the connection receives encrypted files.
7529
+ returned masked as `"******"`). Set this when the connection receives encrypted files, or
7530
+ when its imports sign what they encrypt (`file.pgp.hashAlgorithm`).
7531
+ x-celigo-ai-guidance:
7532
+ - |-
7533
+ Signing needs it: an import that sets `file.pgp.hashAlgorithm` on a connection without a
7534
+ private key fails to save with 422 `missing_required_field` on `file.pgp.hashAlgorithm`
7535
+ ("pgp privateKey is required when hashAlgorithm is selected to perform file signature.").
7526
7536
  passphrase:
7527
7537
  type: string
7528
7538
  writeOnly: true
@@ -9247,10 +9257,11 @@ components:
9247
9257
  retryHeader:
9248
9258
  type: string
9249
9259
  description: |
9250
- HTTP response header name that contains the retry delay (in seconds) when rate-limited.
9251
-
9252
- Defaults to "Retry-After" which is the HTTP standard. Only change this if the API
9253
- uses a non-standard header name for retry-after values.
9260
+ Response header the retry reads for its wait once a response has been recognized
9261
+ as rate-limited — a delay in seconds or an HTTP date. It only sets the wait: a
9262
+ response carrying the header is not treated as throttled unless a status, header
9263
+ or body rule under `rateLimit` matches it. Change it only when the API names its
9264
+ retry-after header differently.
9254
9265
  default: Retry-After
9255
9266
  formType:
9256
9267
  type: string
@@ -9980,42 +9991,60 @@ components:
9980
9991
  rateLimit:
9981
9992
  type: object
9982
9993
  description: |
9983
- Rate limiting configuration. Defines how the system detects and handles
9984
- API rate limit responses.
9985
-
9986
- When rate limiting is detected, the system pauses requests and waits for
9987
- the retry-after period before resuming. The retryHeader field on the parent
9988
- HTTP object controls which response header contains the wait time.
9994
+ Rules for recognizing a throttled response. When any rule is set, every response
9995
+ through the connection is checked against the status code, the header rules and
9996
+ the body rule, and the first match marks the request rate-limited; the retry then
9997
+ waits for the header named by the parent `retryHeader` (`Retry-After` by default).
9998
+ A 429 is recognized with no rules at all; a 2xx response is recognized only through
9999
+ a matching `failHeaders` rule or a matching `failPath` + `failValues` pair, which is
10000
+ how APIs that throttle inside a 200 body (GraphQL, Shopify among them) are handled.
9989
10001
  properties:
9990
10002
  failStatusCode:
9991
10003
  type: number
9992
10004
  description: |
9993
- HTTP status code that indicates the API is rate-limiting requests.
9994
- Defaults to 429 (Too Many Requests) which is the HTTP standard.
9995
- Change only if the API uses a non-standard status code for rate limits.
10005
+ Status code that marks a response rate-limited in place of the standard 429.
10006
+ Set it only when the API throttles with another non-success code; a 2xx value
10007
+ does not make successful responses count as throttled on its own.
9996
10008
  default: 429
9997
10009
  failPath:
9998
10010
  type: string
9999
10011
  description: |
10000
- JSON path or XPath to check in response bodies for rate limit indicators.
10001
- Used when APIs return 200 OK but embed rate limit errors in the response body.
10012
+ JSON path or XPath to the body field that carries the API's throttle indicator,
10013
+ for APIs that answer 200 with the error inside the body. Point at the field
10014
+ itself (`errors.0.extensions.code`), not at the array or object around it, and
10015
+ pair it with `failValues`, which supplies the values that mean "throttled".
10002
10016
  examples:
10003
- - errors[0].code
10017
+ - errors.0.extensions.code
10018
+ x-celigo-ai-guidance:
10019
+ - |-
10020
+ Saves on its own (the probe shows a `failPath` with no `failValues` is accepted),
10021
+ and the documented contract recognizes a 200 as throttled only when `failValues`
10022
+ is set as well. For Shopify GraphQL the platform's own example is
10023
+ `errors.0.extensions.code` with `failValues: ["THROTTLED"]`.
10004
10024
  failValues:
10005
10025
  type: array
10006
10026
  items:
10007
10027
  type: string
10008
10028
  description: |
10009
- Values at failPath that indicate rate limiting. Requires failPath to be set.
10029
+ Values at `failPath` that mean the request was throttled; a match on any of them
10030
+ marks the response rate-limited.
10010
10031
  examples:
10011
- - - rate_limit_exceeded
10012
- - too_many_requests
10032
+ - - THROTTLED
10033
+ - MAX_COST_EXCEEDED
10034
+ x-celigo-ai-guidance:
10035
+ - |-
10036
+ Needs `failPath`: `failValues` without it fails the save with 422
10037
+ `dependent_field` ("The field: failValues should not be specified without the
10038
+ field: failPath for the Connection.").
10013
10039
  failHeaders:
10014
10040
  type: array
10015
10041
  description: |
10016
- Response-header rules for detecting rate limiting, each a header `name` with an
10017
- optional `value`. A rule with an empty `name` fails the save with 422
10018
- `invalid_header_format`.
10042
+ Response-header rules for recognizing a throttled response, each a header `name`
10043
+ with an optional `value`. A rule with a `value` matches when the response header
10044
+ carries that value — the stored text is compared with the header as received; a
10045
+ rule with no `value` matches whenever the header is present at all, so a header
10046
+ the API sends on every response (a remaining-quota counter) would mark every
10047
+ response throttled — give such a header a value.
10019
10048
  items:
10020
10049
  type: object
10021
10050
  required:
@@ -10026,18 +10055,32 @@ components:
10026
10055
  description: Response header the rule checks.
10027
10056
  value:
10028
10057
  type: string
10029
- description: Header value the rule checks; omit to check the header alone.
10058
+ description: Header value the rule compares with the response header; omit to match on the header's presence alone. Stored as sent.
10030
10059
  examples:
10031
10060
  - - name: X-RateLimit-Remaining
10032
10061
  value: '0'
10062
+ x-celigo-ai-guidance:
10063
+ - |-
10064
+ A rule without a `name` fails the save with 422 `invalid_header_format`; a rule
10065
+ with a name and no value saves and matches on presence. The value is stored as
10066
+ sent and not validated at save time.
10033
10067
  limit:
10034
10068
  type: number
10035
10069
  minimum: 1
10070
+ 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').
10036
10071
  description: |
10037
- Maximum number of requests per rate-limit window. When set, the connection's
10038
- effective concurrency level must be 1 to ensure proper rate limit enforcement.
10072
+ Minimum spacing between consecutive requests through the connection, in
10073
+ milliseconds, for APIs that cap request rate rather than concurrency. It only
10074
+ applies when the connection runs one request at a time.
10039
10075
  examples:
10040
10076
  - 1000
10077
+ x-celigo-ai-guidance:
10078
+ - |-
10079
+ Saves only when `concurrencyLevel` is 1 — and, with `autoRecoverRateLimitErrors`
10080
+ on, `targetConcurrencyLevel` is 1 as well; otherwise the save fails with 422
10081
+ `invalid_concurrency_level` ("The field "connection.http.concurrencyLevel"
10082
+ should be set to 1 when the field "connection.http.rateLimit.limit" is
10083
+ populated."). A numeric string is stored as a number.
10041
10084
  headers:
10042
10085
  type: array
10043
10086
  description: |
@@ -20787,6 +20830,11 @@ components:
20787
20830
  - Use `"csv"` for flat tabular data, spreadsheet-like records
20788
20831
  - Use `"xml"` for XML-based integrations, SOAP services
20789
20832
  - Use `"xlsx"` for Excel-compatible outputs
20833
+ - |-
20834
+ What writes the file's content differs by type: `csv` and `xlsx` are mapping-driven
20835
+ (the mapped record's fields become the columns); `json` is mapping-driven too unless
20836
+ `json.body` is set; `xml` always needs the `xml.body` template; `filedefinition` takes
20837
+ the file definition's rules. Pick the type first, then author only that type's block.
20790
20838
  encoding:
20791
20839
  type: string
20792
20840
  enum:
@@ -20881,14 +20929,33 @@ components:
20881
20929
  x-enumDescriptions:
20882
20930
  pgp: Encrypt the file with PGP before it is written.
20883
20931
  description: |-
20884
- Encrypts the output file; omit it for an unencrypted file. `pgp` requires
20885
- `pgp.symmetricKeyAlgorithm` and a connection holding the recipient's public key
20886
- (`pgp.publicKey`) — without either the save fails with 422 `missing_required_field`.
20887
- The public-key check runs first: on a connection without one, any `encrypt` value,
20888
- `false` included, fails with 422 `missing_required_field` "pgp publicKey is required
20889
- when encrypt is selected to perform file encryption." before the value is checked.
20890
- Blob (file-transfer) imports follow the same rule and return `encrypt` and `pgp` even
20891
- without `file.type`.
20932
+ Encrypts the file before it reaches the destination — a file generated from records
20933
+ or, on a `blob: true` transfer, the existing file being moved; omit it for an
20934
+ unencrypted file. `pgp` requires `pgp.symmetricKeyAlgorithm` and a connection holding
20935
+ the recipient's public key (`pgp.publicKey`). Not observed in a run here; per the file
20936
+ adaptor's code (IO-213945, the `blob: true` transfer path): with no `compressionFormat`,
20937
+ a file over 200 MB fails the record before encryption with `pgp_file_size_exceeded`
20938
+ ("The file size exceeds the maximum limit of 200 MB supported for PGP encryption." —
20939
+ the adaptor's `errorStore.js` text); with `compressionFormat` set the adaptor skips that
20940
+ pre-check (the compressed size is not known up front) and the encryption service
20941
+ enforces its own 200 MB limit on the compressed file (`S3_FILE_SIZE_EXCEEDED`); a key
20942
+ the platform cannot use fails with the PGP service's own code (`PGP_PUBLICKEY_INVALID` /
20943
+ `PGP_PRIVATEKEY_INVALID` — "<operation> failed because the <key> is invalid."), and
20944
+ `encryption_error` ("error in encrypting the file") only when the service returns no
20945
+ code; the file is never written in clear and a transfer's encryption failure is not
20946
+ retried automatically. A file generated from records meets the same encryption-service
20947
+ limit with `S3_FILE_SIZE_EXCEEDED`.
20948
+ 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.'
20949
+ x-celigo-ai-guidance:
20950
+ - |-
20951
+ Without `pgp.symmetricKeyAlgorithm` the save fails with 422 `missing_required_field` on
20952
+ `file.pgp.symmetricKeyAlgorithm`; on a connection without `pgp.publicKey` it fails with
20953
+ 422 `missing_required_field` on `file.encrypt` ("pgp publicKey is required when encrypt
20954
+ is selected to perform file encryption."), and that check runs first, for any value.
20955
+ - |-
20956
+ `true` and `false` are rejected with 422 `enum` — the field is the string `pgp`, never a
20957
+ boolean. Blob transfers follow the same save rules and return `encrypt` and `pgp` on
20958
+ reads even without `file.type`.
20892
20959
  csv:
20893
20960
  type: object
20894
20961
  description: CSV-specific configuration. Only used when `type` is `"csv"`.
@@ -20928,6 +20995,41 @@ components:
20928
20995
  type: object
20929
20996
  description: JSON-specific configuration. Only used when `type` is `"json"`.
20930
20997
  properties:
20998
+ body:
20999
+ type: string
21000
+ x-celigo-agent:
21001
+ - handlebars
21002
+ description: |-
21003
+ Handlebars template for the generated JSON document — the *Build JSON document*
21004
+ editor. Rendered once per file against the records of the page, after the mapping:
21005
+ text before the `{{#each batch_of_records}}` loop is the file's header, the loop
21006
+ body is written once per record, text after it is the footer; under
21007
+ `aggregation.type: all` the loop's output for every page of the run is written
21008
+ between one header and one footer. Omit it to write the mapped records as a JSON
21009
+ array per file.
21010
+ x-celigo-ai-guidance:
21011
+ - |-
21012
+ Leave this out unless the user needs a custom document shape: with no body the
21013
+ platform writes each file as a JSON array of the mapped records. A saved body
21014
+ overrides that — a leftover `{}` body writes literal `{}` files.
21015
+ - |-
21016
+ When a body is needed, wrap the per-record part in `{{#each batch_of_records}} …
21017
+ {{/each}}` and address the record inside it as `record.<field>` (a grouped record
21018
+ as `{{#each rows}} … {{/each}}`); `{{{jsonSerialize record}}}` with
21019
+ `{{#unless @last}},{{/unless}}` between elements is the common form. The JSON
21020
+ generator recognises only that loop: a `{{#each data}}` loop is written whole per
21021
+ page and the pages are joined with commas (`[…],[…]`, invalid JSON under one file
21022
+ per run). At the root there is no `record`: `{{record.<field>}}` or a bare
21023
+ `{{<field>}}` outside the loop renders empty, while `batch_of_records` is in
21024
+ scope (`batch_of_records.0.record.<field>` is the first record when a header needs
21025
+ it). A body with no loop is rendered whole once per page — `{"id": {{record.id}} }`
21026
+ becomes `{"id": }` per page — and under `aggregation.type: all` the pages are
21027
+ joined with commas (`{"id": },{"id": }`), which is invalid JSON even when each
21028
+ page's own text was valid.
21029
+ - |-
21030
+ The template renders against the page whatever `http.batchSize` says, and `http.body`
21031
+ plays no part in the file's content. The field's editor Preview does not run the
21032
+ generator, so judge the body by a run.
20931
21033
  resourcePath:
20932
21034
  type: string
20933
21035
  description: JSONPath expression to locate records within the JSON structure.
@@ -20935,6 +21037,39 @@ components:
20935
21037
  type: object
20936
21038
  description: XML-specific configuration. Only used when `type` is `"xml"`.
20937
21039
  properties:
21040
+ body:
21041
+ type: string
21042
+ x-celigo-agent:
21043
+ - handlebars
21044
+ description: |-
21045
+ Handlebars template for the generated XML document — the *Build XML document*
21046
+ editor. Rendered once per file against the records of the page, after the mapping:
21047
+ text before the record loop is the file's header, the loop body is written once per
21048
+ record, text after it is the footer; under `aggregation.type: all` the loop's
21049
+ output for every page of the run is written between one header and one footer.
21050
+ Must be set when `type` is `"xml"` — there is no mapping-driven XML.
21051
+ x-celigo-ai-guidance:
21052
+ - |-
21053
+ Author it as header + record loop + footer: the XML declaration and root element
21054
+ around `{{#each batch_of_records}} … {{/each}}`, with the record addressed inside
21055
+ the loop as `record.<field>` (a grouped record as `{{#each rows}} … {{/each}}`,
21056
+ nested elements as `{{#each record.<list>}} … {{/each}}`). The XML generator also
21057
+ accepts the legacy `{{#each data}} … {{/each}}`, which binds the record itself as
21058
+ `this` (`{{<field>}}`). At the root there is no `record`: `{{record.<field>}}` or
21059
+ a bare `{{<field>}}` outside the loop renders empty, while `batch_of_records` is in
21060
+ scope (`batch_of_records.0.record.<field>` is the first record when a header needs
21061
+ it). A body with no loop is rendered whole once per page — `<root>{{record.id}}</root>`
21062
+ becomes `<root></root>` per page — and under `aggregation.type: all` the pages are
21063
+ concatenated into one multi-root file (`<root></root><root></root>`); the import
21064
+ form does not let a one-file-per-run XML template without an each block save,
21065
+ while an API save writes that file.
21066
+ - |-
21067
+ The template renders against the page whatever `http.batchSize` says, and on an
21068
+ HTTP file-provider import `http.body` plays no part in the file's content. The
21069
+ field's editor Preview does not run the generator, so judge the body by a run.
21070
+ - |-
21071
+ Saving `type: xml` without this field fails with 422 `missing_required_field`
21072
+ ("required field, file.xml.body is missing.").
20938
21073
  resourcePath:
20939
21074
  type: string
20940
21075
  description: XPath expression to locate records within the XML structure.
@@ -21092,10 +21227,16 @@ components:
21092
21227
  sha384: SHA-384 signing hash.
21093
21228
  sha512: SHA-512 signing hash.
21094
21229
  sha224: SHA-224 signing hash.
21095
- description: Hash algorithm used when signing the encrypted file; set only when the recipient requires a specific one.
21230
+ 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`.
21096
21231
  examples:
21097
21232
  - sha256
21098
21233
  - sha512
21234
+ x-celigo-ai-guidance:
21235
+ - |-
21236
+ On a connection without `pgp.privateKey` the save fails with 422
21237
+ `missing_required_field` on `file.pgp.hashAlgorithm` ("pgp privateKey is required
21238
+ when hashAlgorithm is selected to perform file signature."); leave it unset unless
21239
+ the connection holds the private key.
21099
21240
  skipRename:
21100
21241
  type: boolean
21101
21242
  description: |-
@@ -21225,6 +21366,19 @@ components:
21225
21366
  description: Provider-native ID of the storage root the backup relative path resolves against; set when pathMode is relativePath.
21226
21367
  examples:
21227
21368
  - 1qU1hvFarBFMb4-twqKm1rR5o_6j9vs9g
21369
+ if:
21370
+ properties:
21371
+ type:
21372
+ const: xml
21373
+ required:
21374
+ - type
21375
+ then:
21376
+ required:
21377
+ - xml
21378
+ properties:
21379
+ xml:
21380
+ required:
21381
+ - body
21228
21382
  FileSystem:
21229
21383
  type: object
21230
21384
  description: |-
@@ -27455,6 +27609,9 @@ components:
27455
27609
  - exported_to_netsuite
27456
27610
  Webhook:
27457
27611
  type: object
27612
+ required:
27613
+ - verify
27614
+ 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.'
27458
27615
  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.
27459
27616
  x-celigo-ai-guidance:
27460
27617
  - Configuration object for real-time event listeners that receive data via incoming HTTP requests.
@@ -27529,7 +27686,7 @@ components:
27529
27686
  properties:
27530
27687
  provider:
27531
27688
  type: string
27532
- 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.
27689
+ 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).'
27533
27690
  x-celigo-ai-guidance:
27534
27691
  - |-
27535
27692
  Specifies the source application sending webhook data,
@@ -27540,10 +27697,18 @@ components:
27540
27697
  This field determines how the webhook handles incoming requests:
27541
27698
 
27542
27699
  - OPTIONAL: Defaults to "custom" if not specified
27543
- - When a specific provider is selected, the system:
27544
- 1. Pre-configures appropriate security settings for that platform
27545
- 2. Applies platform-specific payload parsing rules
27546
- 3. May enable additional features only relevant to that provider
27700
+ - A named provider labels the listener, picks its form view (`formType`
27701
+ defaults to `simple`) and makes a credential required — probed for
27702
+ `slack`, `shopify` and `github`: without `key` (and no `token`) each
27703
+ fails with 422 missing_required_field on `webhook.key`, "key is required
27704
+ for slack verification" / "key is required for shopify verification" /
27705
+ "key is required for github verification"; a `slack` listener posted
27706
+ with `token` and no `key` saved. It does NOT make the API fill in
27707
+ `verify` and its companions — a document sent to the API stores exactly
27708
+ what it carries, and the listener form fills them from the connector
27709
+ definition before saving. Send them when the stored document should
27710
+ match a form-saved one (Slack: `verify: hmac`, `algorithm: sha256`,
27711
+ `encoding: base64`, `header: X-Slack-Signature`).
27547
27712
  - |-
27548
27713
  ## IMPLEMENTATION GUIDANCE
27549
27714
 
@@ -27553,9 +27718,10 @@ components:
27553
27718
  ```
27554
27719
  "provider": "shopify"
27555
27720
  ```
27556
- - Automatically configures proper HMAC verification settings
27557
- - Optimizes payload parsing for Shopify's webhook format
27558
- - May enable additional Shopify-specific features
27721
+ - Labels the listener as Shopify's and opens it in the Simple form view
27722
+ - Requires `key` (422 "key is required for shopify verification"); saves
27723
+ without `verify` and its companions, which the form would have filled in —
27724
+ send them for a document that matches a form-saved one
27559
27725
 
27560
27726
  ### Custom configuration
27561
27727
 
@@ -27571,7 +27737,7 @@ components:
27571
27737
 
27572
27738
  Choose a specific provider when:
27573
27739
  - The source system is explicitly listed in the enum values
27574
- - You want to leverage pre-configured settings
27740
+ - You want the form's pre-filled verification settings for that platform
27575
27741
  - The integration must follow platform-specific practices
27576
27742
 
27577
27743
  Choose "custom" when:
@@ -27618,7 +27784,7 @@ components:
27618
27784
  shopify: Shopify store event webhooks with HMAC-SHA256 verification.
27619
27785
  travis: Travis CI build event webhooks (travis-ci.com).
27620
27786
  travis-org: Travis CI build event webhooks (travis-ci.org).
27621
- slack: Slack workspace event webhooks with token verification.
27787
+ 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.
27622
27788
  dropbox: Dropbox file change notification webhooks.
27623
27789
  onfleet: Onfleet delivery management event webhooks.
27624
27790
  helpscout: Help Scout customer support event webhooks.
@@ -27660,13 +27826,19 @@ components:
27660
27826
  Which webhook export form the UI uses to edit this listener. A value sent on create or
27661
27827
  update wins (case-insensitive — `Simple` is stored as `simple`); a PUT that omits it
27662
27828
  keeps the stored value, and a new export without one gets the default for its
27663
- `provider`. Every webhook export GET carries it.
27664
- examples:
27665
- - webhook
27829
+ `provider`. Every webhook export GET carries it. The view changes nothing at run time:
27830
+ the listener URL, the verification and the flows are the same in both.
27831
+ x-celigo-ai-guidance:
27832
+ - |-
27833
+ Omit it on create — the API stamps the provider's default (`simple` for a named
27834
+ provider, `webhook` for `custom`), with or without `_httpConnectorId`, and keeps a
27835
+ value the user set by hand. The legacy UI values `http` / `assistant` fail with 422
27836
+ `enum`, and the field is not PATCH-whitelisted (422 "not a whitelisted property"):
27837
+ change it through a full save.
27666
27838
  verify:
27667
27839
  type: string
27668
27840
  x-celigo-ui-override: Required by the webhook export form (verify is required:true). Encoded to mirror the form so builders produce connectable configurations.
27669
- 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.'
27841
+ 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.'
27670
27842
  x-celigo-ai-guidance:
27671
27843
  - |-
27672
27844
  ## FIELD BEHAVIOR
@@ -28110,6 +28282,32 @@ components:
28110
28282
  format: objectId
28111
28283
  x-celigo-refModel: httpconnectors
28112
28284
  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.
28285
+ x-celigo-ai-guidance:
28286
+ - |-
28287
+ The save stores the document as sent and copies nothing from the connector: a
28288
+ listener posted with only `provider`, `key` and (optionally) `_httpConnectorId`
28289
+ saves with no `verify`, `algorithm`, `encoding` or `header` (probed for `slack`
28290
+ and `shopify`) — the API requires a credential for the provider and nothing else:
28291
+ without `key` (and no `token`) `slack`, `shopify` and `github` each fail with 422
28292
+ missing_required_field on `webhook.key` ("key is required for slack verification" /
28293
+ "key is required for shopify verification" / "key is required for github
28294
+ verification"), and a `slack` listener posted with `token` and no `key` saves. The
28295
+ listener form fills the verification fields from the connector's
28296
+ `supportedBy.export.preConfiguredFields` on every save (for Slack `verify: hmac`,
28297
+ `algorithm: sha256`, `encoding: base64`, `header: X-Slack-Signature`); an API
28298
+ caller that wants the stored document to match a form-saved one sends them itself.
28299
+ _httpConnectorApiId:
28300
+ type: string
28301
+ format: objectId
28302
+ x-celigo-refModel: httpconnectorapis
28303
+ 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.
28304
+ examples:
28305
+ - 673702e2f367e6469401dcf6
28306
+ x-celigo-ai-guidance:
28307
+ - |-
28308
+ Stored and echoed as sent on create and GET; a value that is not an ObjectId fails
28309
+ the save with 422 `invalid_field` ("Invalid value … for field
28310
+ 'webhook._httpConnectorApiId'. Reason: BSONError.").
28113
28311
  requestMediaType:
28114
28312
  type: string
28115
28313
  enum:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@celigo/api-specs",
3
- "version": "0.2.208",
3
+ "version": "0.2.210",
4
4
  "private": false,
5
5
  "description": "Public OpenAPI bundles (dist/) and the celigo-cli lint schema pack (schemas.json).",
6
6
  "keywords": [