@celigo/api-specs 0.2.114 → 0.2.116

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/ai-agent.yml CHANGED
@@ -566,6 +566,182 @@ paths:
566
566
  value: {}
567
567
  '401':
568
568
  $ref: '#/components/responses/401-unauthorized'
569
+ /v1/imports/{_id}/aiagents/chat:
570
+ post:
571
+ x-internal: false
572
+ operationId: chatWithAiAgent
573
+ tags:
574
+ - AI Agents
575
+ summary: Chat with a saved AI agent
576
+ description: |-
577
+ Sends one message to a saved AI agent and streams the answer as
578
+ `text/event-stream`. Events arrive in order: `init`, `thinking`
579
+ (started), a `progress` pair per tool call (`tool <name> started` /
580
+ `finished`), `thinking` (completed) — a Celigo Tool's inner-step
581
+ `progress` events can still arrive after it — `responsechunk` deltas
582
+ of the reply (raw text — join them), `usage` (tokens and AI-credit cost),
583
+ `complete` (`data.success`); an `error` event replaces the reply when
584
+ the turn fails (see `ChatStreamEvent`). The agent runs as configured:
585
+ its tools (web search, MCP servers, Celigo Tools) execute for real and
586
+ the turn is billed — AI credits on a hosted model, the key's owner on
587
+ a BYOK one. The same `conversationHistoryId` across requests keeps a
588
+ conversation; without it the message is a single turn and nothing is
589
+ stored. Needs the `ai_agent:chat` permission (manage and administrator
590
+ roles; monitor gets 403) and `Content-Type: application/json` (415 if
591
+ not).
592
+
593
+ None of the flow pipeline runs — no input filter, mappings, hooks or
594
+ response mapping — so this is the agent in conversation, not the import
595
+ step; `POST /v1/imports/preview` runs the step with its pre-submit
596
+ stages. A tile-level manager can chat only with agents inside
597
+ accessible integrations. Files travel as storage keys from the UI's
598
+ signed-upload flow; the public API has no upload route. The stream
599
+ carries its own failure: a turn the agent service could not finish
600
+ still answers 200 with an `error` event inside it. Read the events in
601
+ order and stop at `complete`, or at an `error` that ends the stream.
602
+ parameters:
603
+ - name: _id
604
+ in: path
605
+ required: true
606
+ description: 'The AI agent — an import with `adaptorType: AiAgentImport`.'
607
+ schema:
608
+ type: string
609
+ format: objectId
610
+ x-celigo-refModel: imports
611
+ requestBody:
612
+ required: true
613
+ content:
614
+ application/json:
615
+ schema:
616
+ $ref: '#/components/schemas/ChatRequest'
617
+ examples:
618
+ single-turn:
619
+ summary: One message, no conversation
620
+ value:
621
+ data:
622
+ - text: 'Classify this ticket: the invoice total is wrong on order 4411.'
623
+ continued-conversation:
624
+ summary: A follow-up in a conversation the caller keys
625
+ value:
626
+ data:
627
+ - text: What did you decide for the previous ticket?
628
+ conversationHistoryId: support-triage-session-42
629
+ responses:
630
+ '200':
631
+ description: |-
632
+ The turn as a stream of server-sent events, ending with `complete`.
633
+ A turn the agent service could not finish still answers 200: the
634
+ failure arrives inside the stream as an `error` event.
635
+ content:
636
+ text/event-stream:
637
+ itemSchema:
638
+ $ref: '#/components/schemas/ChatStreamEvent'
639
+ examples:
640
+ reply-with-a-web-search:
641
+ summary: A turn that called web search, as the raw stream
642
+ value: |
643
+ event: init
644
+ data: {"requestId": "3e71c33f-1c5e-4df5-93af-b3d503b28b23"}
645
+
646
+ event: thinking
647
+ data: {"status": "started", "requestId": "3e71c33f-1c5e-4df5-93af-b3d503b28b23"}
648
+
649
+ event: progress
650
+ data: {"content": "tool web_search started", "input": "", "output": "", "requestid": "3e71c33f-1c5e-4df5-93af-b3d503b28b23"}
651
+
652
+ event: progress
653
+ data: {"content": "tool web_search finished", "input": "", "output": "", "requestid": "3e71c33f-1c5e-4df5-93af-b3d503b28b23"}
654
+
655
+ event: thinking
656
+ data: {"status": "completed", "requestId": "3e71c33f-1c5e-4df5-93af-b3d503b28b23", "durationMs": 6571, "summary": "Called web_search"}
657
+
658
+ event: responsechunk
659
+ data: Latest stable Python 3 release: 3.15.0 — source: python.org.
660
+
661
+ event: usage
662
+ data: {"content": {"model": "gpt-5-mini", "input_tokens": 9218, "output_tokens": 737, "total_tokens": 9955, "token_only_ai_credits": 0.004345275, "tool_addon_cost": 0.01, "total_cost": 0.015845275, "web_search_details": {"billed_search_actions": 1, "tool_call_ai_credits": 0.0115}, "tool_call_buckets": [{"category": "native_tool", "total_count": 1, "tools": [{"name": "web_search", "count": 1}]}]}}
663
+
664
+ event: complete
665
+ data: {"success": true}
666
+ '400':
667
+ $ref: '#/components/responses/400-bad-request'
668
+ '401':
669
+ $ref: '#/components/responses/401-unauthorized'
670
+ '403':
671
+ $ref: '#/components/responses/403-forbidden'
672
+ '404':
673
+ $ref: '#/components/responses/404-not-found'
674
+ '415':
675
+ description: '`Content-Type: application/json` header is missing.'
676
+ /v1/aiagents/chat:
677
+ post:
678
+ x-internal: false
679
+ operationId: chatWithVirtualAiAgent
680
+ tags:
681
+ - AI Agents
682
+ summary: Chat with an unsaved AI agent document
683
+ description: |-
684
+ Sends one message to an AI agent document carried in the request — a
685
+ draft never saved, or a saved agent with unsaved changes — and streams
686
+ the answer back as `text/event-stream` with the same events as
687
+ `POST /v1/imports/{_id}/aiagents/chat` (see `ChatStreamEvent`). The
688
+ document is validated in memory the way a save validates it and is
689
+ never persisted: the saved agent, if there is one, is untouched, so
690
+ this is how a change is tried before it is saved. The agent's tools
691
+ execute for real and the turn is billed; none of the flow pipeline
692
+ runs. `conversationHistoryId` keeps a conversation keyed on the
693
+ document's `_id` when one is present, so a draft of a saved agent can
694
+ continue that agent's history. Needs the `ai_agent:virtual_chat`
695
+ permission (manage and administrator roles; monitor gets 403) and
696
+ `Content-Type: application/json` (415 otherwise).
697
+
698
+ The integrator.io agent editor uses this route for a Test or chat
699
+ message while the form has unsaved edits. A tile-level manager can use
700
+ it only when every connection, MCP connection and Celigo Tool the
701
+ document references is inside accessible integrations. A turn the
702
+ agent service could not finish still answers 200 with an `error` event
703
+ inside the stream.
704
+ requestBody:
705
+ required: true
706
+ content:
707
+ application/json:
708
+ schema:
709
+ $ref: '#/components/schemas/VirtualChatRequest'
710
+ examples:
711
+ try-changed-instructions:
712
+ summary: Run a saved agent's document with edited instructions, without saving
713
+ value:
714
+ data:
715
+ - text: 'Classify this ticket: the invoice total is wrong on order 4411.'
716
+ import:
717
+ _id: 6ad1005b1c1632e833de1227
718
+ name: Ticket triage
719
+ adaptorType: AiAgentImport
720
+ aiAgent:
721
+ provider: openai
722
+ openai:
723
+ model: gpt-5-mini
724
+ instructions: Classify the ticket and always ask for the order number when it is missing.
725
+ responses:
726
+ '200':
727
+ description: |-
728
+ The turn as a stream of server-sent events, ending with `complete`.
729
+ A turn the agent service could not finish still answers 200: the
730
+ failure arrives inside the stream as an `error` event.
731
+ content:
732
+ text/event-stream:
733
+ itemSchema:
734
+ $ref: '#/components/schemas/ChatStreamEvent'
735
+ '400':
736
+ $ref: '#/components/responses/400-bad-request'
737
+ '401':
738
+ $ref: '#/components/responses/401-unauthorized'
739
+ '403':
740
+ $ref: '#/components/responses/403-forbidden'
741
+ '415':
742
+ description: '`Content-Type: application/json` header is missing.'
743
+ '422':
744
+ $ref: '#/components/responses/422-unprocessable-entity'
569
745
  components:
570
746
  securitySchemes:
571
747
  bearerAuth:
@@ -6214,6 +6390,173 @@ components:
6214
6390
  dependencyIds:
6215
6391
  export:
6216
6392
  - 64ff4b21612a134bd2f45534
6393
+ ChatMessage:
6394
+ type: object
6395
+ description: |-
6396
+ One message for the agent. Give it `text`, `files`, or both; the agent
6397
+ answers in the streamed response.
6398
+ properties:
6399
+ text:
6400
+ type: string
6401
+ description: |-
6402
+ The message the agent answers. Whitespace-only text counts as empty,
6403
+ so a message with no `files` must carry visible text.
6404
+ examples:
6405
+ - 'Classify this ticket: the invoice total is wrong on order 4411.'
6406
+ files:
6407
+ type: array
6408
+ description: |-
6409
+ Files the agent reads with the message (images, PDFs, JSON documents).
6410
+ Each entry names an object already uploaded to the account's file
6411
+ storage through the signed-upload flow the integrator.io UI uses; the
6412
+ public API has no upload route of its own.
6413
+ items:
6414
+ type: object
6415
+ required:
6416
+ - name
6417
+ - blobKey
6418
+ properties:
6419
+ name:
6420
+ type: string
6421
+ description: File name shown to the agent.
6422
+ examples:
6423
+ - invoice-4411.pdf
6424
+ blobKey:
6425
+ type: string
6426
+ description: Storage key of the uploaded file, as returned by the signed-upload flow.
6427
+ conversationHistoryId:
6428
+ type: string
6429
+ maxLength: 200
6430
+ description: |-
6431
+ Caller-chosen key for a conversation with this agent. Turns sent
6432
+ with the same key share a history: the agent sees the earlier
6433
+ requests and replies and the history is updated after each turn.
6434
+ The key is scoped to the calling user and the agent, so the same
6435
+ string against a different agent is a different conversation. Omit
6436
+ it for a single-turn message — nothing is stored.
6437
+ examples:
6438
+ - support-triage-session-42
6439
+ x-celigo-ai-guidance:
6440
+ - |-
6441
+ A history keyed by a caller-chosen `conversationHistoryId` is runtime memory for the
6442
+ agent; it does not appear in the agent's Conversation history in the integrator.io
6443
+ UI, which lists only conversations started from the UI.
6444
+ ChatRequest:
6445
+ type: object
6446
+ description: |-
6447
+ Body of a chat turn with a saved AI agent: `data` holds the one message
6448
+ — its `text`, its `files` (name and storage `blobKey` of uploaded
6449
+ files), and an optional `conversationHistoryId` that keeps a
6450
+ conversation across requests.
6451
+ x-celigo-ai-guidance:
6452
+ - |-
6453
+ Rejections before the agent runs use the standard error envelope: 400 `invalid_request`
6454
+ ("Request body can't be empty.") for an empty body; 400 `missing_required_field` ("data
6455
+ (must be an array with exactly one element) is required.") when `data` is not a
6456
+ one-element array, and ("data[0].text or data[0].files is required.") when the one
6457
+ message has neither `files` nor a non-blank `text`; 404 `invalid_ref` ("Import not
6458
+ found.") when no import with the `_id` is in the account.
6459
+ required:
6460
+ - data
6461
+ properties:
6462
+ data:
6463
+ type: array
6464
+ minItems: 1
6465
+ maxItems: 1
6466
+ description: |-
6467
+ Exactly one message per request. A request with more than one entry
6468
+ is rejected before the agent runs.
6469
+ items:
6470
+ $ref: '#/components/schemas/ChatMessage'
6471
+ ChatStreamEvent:
6472
+ type: object
6473
+ description: |-
6474
+ One server-sent event of a chat turn. The stream is `text/event-stream`:
6475
+ each event is an `event:` line naming the event and one or more `data:`
6476
+ lines carrying its payload, separated by a blank line. `data` is JSON for
6477
+ every event except `responsechunk`, whose `data:` lines are raw text (one
6478
+ line per line of the delta). A successful turn is `init`, `thinking`
6479
+ (started), any number of `progress` events, `thinking` (completed), the
6480
+ `responsechunk` deltas, `usage`, `complete`; a Celigo Tool's inner-step
6481
+ `progress` events can still arrive after `thinking` (completed).
6482
+ required:
6483
+ - event
6484
+ properties:
6485
+ event:
6486
+ type: string
6487
+ enum:
6488
+ - init
6489
+ - thinking
6490
+ - progress
6491
+ - responsechunk
6492
+ - bloboutput
6493
+ - usage
6494
+ - complete
6495
+ - error
6496
+ x-enumDescriptions:
6497
+ init: First event; `data.requestId` identifies the turn
6498
+ thinking: '`data.status` is `started` when the agent begins and `completed` with `durationMs` (and a `summary` such as `Called web_search`) when it is done reasoning'
6499
+ progress: 'A tool the agent is using — `data.content` reads `tool <name> started` or `tool <name> finished` (a Celigo Tool is named `celigo_tool_<_toolId>`), with `input` and `output` when the tool reports them; a Celigo Tool''s inner steps arrive as `data.content` `<step name>: <step type>` with `data.input` `step_start`, `step_complete` or `step_failed`, `data.output` the step''s stats as text, and `data.step` `{type: tool_step, event, name, tool_id, stepType, stats, attempt}`'
6500
+ responsechunk: A delta of the agent's reply; concatenate the deltas in order for the full text
6501
+ bloboutput: A file the agent produced — `data.content.preSignedURL` is a time-limited download link
6502
+ usage: Token counts and cost of the turn — `data.content` is a `ChatUsage` object; sent for every turn that reached the agent, also after an `error` the agent service reported
6503
+ complete: Last event of a turn that reached the agent — `data.success` is `true`, or `false` when an `error` event preceded it
6504
+ error: The turn failed — see the description of this schema for the payload shapes
6505
+ description: Name carried on the `event:` line.
6506
+ data:
6507
+ description: |-
6508
+ The event payload. For `error` the payload shape says where the
6509
+ failure happened. The agent service reports `{code, message, source?}`
6510
+ (for example `tool_stream_error` / `Tool execution failed` with
6511
+ `source: tools`) and the stream goes on to `usage` and `complete`
6512
+ with `success: false`. The chat relay reports `{content: {code,
6513
+ message}}` and ends the stream there — no `usage`, no `complete`
6514
+ (`validation_error` for a `conversationHistoryId` over 200
6515
+ characters). A stream that broke before reaching the relay
6516
+ arrives as a `data:` line with no `event:` line whose JSON carries
6517
+ `error` or `code`.
6518
+ oneOf:
6519
+ - type: object
6520
+ additionalProperties: true
6521
+ - type: string
6522
+ VirtualChatRequest:
6523
+ type: object
6524
+ description: |-
6525
+ Body of a chat turn with an AI agent document that has not been saved
6526
+ (or has unsaved changes): `data` holds the one message — `text`,
6527
+ `files` and an optional `conversationHistoryId`, as on the saved-agent
6528
+ route — and `import` carries the document to run, in the shape
6529
+ `GET /v1/imports/{_id}` returns. The document is validated in memory
6530
+ the same way a save validates it and is never persisted.
6531
+ x-celigo-ai-guidance:
6532
+ - |-
6533
+ The document is checked in this order: 400 `invalid_request` ("Import document should be
6534
+ a JSON object.") when `import` is missing or not an object; 422 — the validation a save
6535
+ runs — `missing_required_field` on a field the import schema requires, or `invalid_ref`
6536
+ with `field: _connectionId` ("<id> is not a valid _connectionId") on a connection not in
6537
+ the account; then 400 `invalid_adaptor` ("Unsupported operation: Chat route is enabled
6538
+ only for AI Agent imports.") when `adaptorType` is not `AiAgentImport`. The `data` rules
6539
+ match the saved-agent route.
6540
+ required:
6541
+ - data
6542
+ - import
6543
+ properties:
6544
+ data:
6545
+ type: array
6546
+ minItems: 1
6547
+ maxItems: 1
6548
+ description: Exactly one message per request.
6549
+ items:
6550
+ $ref: '#/components/schemas/ChatMessage'
6551
+ import:
6552
+ description: |-
6553
+ The AI agent document to run, with `adaptorType: AiAgentImport` and
6554
+ the `aiAgent` block for the configuration under test. An `_id` is
6555
+ optional; when present it is kept, so a `conversationHistoryId`
6556
+ continues the same history the saved agent uses. A `_connectionId`
6557
+ selects the BYOK connection the turn runs through.
6558
+ allOf:
6559
+ - $ref: '#/components/schemas/Request'
6217
6560
  responses:
6218
6561
  400-bad-request:
6219
6562
  description: |
@@ -6302,5 +6645,18 @@ components:
6302
6645
  errors:
6303
6646
  - code: dependencies_not_deleted
6304
6647
  message: export 6902d88c10b42b2eaac9b2a1 must be deleted before you can delete connection 6398ddf316be761fb16a6523
6648
+ 403-forbidden:
6649
+ description: |
6650
+ Forbidden. The authenticated caller does not have permission to perform this operation.
6651
+ content:
6652
+ application/json:
6653
+ schema:
6654
+ $ref: '#/components/schemas/Error'
6655
+ examples:
6656
+ default:
6657
+ value:
6658
+ errors:
6659
+ - code: forbidden
6660
+ message: You do not have permission to access this resource.
6305
6661
  x-enable-proxy: true
6306
6662
  x-internal: false
package/dist/export.yml CHANGED
@@ -16061,11 +16061,25 @@ components:
16061
16061
  Handlebars template that overrides how each record's unique trace key is generated, used
16062
16062
  to track records through the flow and match retries to prior errors (e.g.
16063
16063
  `{{join "_" record.customerId record.orderId}}`). When omitted, the system picks a unique
16064
- field automatically. If a transform reshapes the data first, omit the `record.` prefix.
16065
- Trace keys are capped at 256 characters; a longer key is stored truncated from the middle,
16066
- keeping the beginning and end of the value. Downstream imports use the trace key as their
16067
- default concurrency lock key (a blank key means no lock); it never de-duplicates — a record
16068
- emitted twice with the same key is processed twice.
16064
+ field automatically from the record's top level, by exact field name (`GET
16065
+ /v1/flows/{_id}/traceKey` serves the pattern). The rendered value of a template is stamped
16066
+ on each record as `io_custom_trace_key` and travels downstream with it. If a transform
16067
+ reshapes the data first, omit the `record.` prefix. Trace keys are capped at 256 characters;
16068
+ a longer key is stored truncated from the middle, keeping the beginning and end of the
16069
+ value. Downstream imports use the trace key as their default concurrency lock key (a blank
16070
+ key means no lock); it never de-duplicates — a record emitted twice with the same key is
16071
+ processed twice.
16072
+ x-celigo-ai-guidance:
16073
+ - |-
16074
+ The default derivation reads these top-level fields in order and takes the first present
16075
+ (a record carrying `id` and `internalId` is keyed on `id` alone) — `id`, `Id`, `ID`,
16076
+ `internalid`, `Internalid`, `internalId`, `InternalId`, `INTERNALID`, `_id`, `_Id`, `_ID`,
16077
+ `internal_id`, `internal_Id`, `Internal_id`, `Internal_Id`, `INTERNAL_ID`, `identifier`,
16078
+ `IDENTIFIER` — then a `*anything` rule the platform does not document.
16079
+ - |-
16080
+ A record in flight through the flow carries `io_custom_trace_key` when a template is set
16081
+ — that value is the downstream imports' default lock key; without a template the record
16082
+ carries no trace-key field (the key is derived, not stored on the record).
16069
16083
  examples:
16070
16084
  - '{{record.id}}'
16071
16085
  - '{{join "_" record.customerId record.orderId}}'
package/dist/import.yml CHANGED
@@ -15944,7 +15944,8 @@ components:
15944
15944
  Handlebars template that generates a concurrency lock key for each record: records that
15945
15945
  render the same key are never submitted at the same time, while records with different
15946
15946
  keys are processed in parallel. When omitted, the record's trace key is the lock key (a
15947
- blank trace key means no lock); a template replaces that default rather than adding to it.
15947
+ blank trace key means no lock; a custom `traceKeyTemplate` upstream arrives on the record
15948
+ as `io_custom_trace_key`); a template replaces that default rather than adding to it.
15948
15949
  The template is rendered from the record as it arrives at the import — before the import's
15949
15950
  own lookups and mapping run — so a key built from one of the import's lookup results
15950
15951
  (`{{lookup.<name>}}`) or from a mapped field renders empty, and an empty key is no lock at
package/dist/job.yml CHANGED
@@ -45,10 +45,26 @@ paths:
45
45
  pass at least one of `_integrationId`, `_flowId`, `_exportId`,
46
46
  `_importId`, `_flowJobId`, `createdAt_gte`, or `createdAt_lte` to
47
47
  scope the query. Omitting all filters returns all jobs in the account.
48
+ Exception: for a caller with integration-only access, `_flowId` scopes
49
+ a `type=flow` or `type=retry` query only together with
50
+ `_integrationId` (below).
48
51
  - **Child jobs** (`type=export` or `type=import`) — requires
49
52
  `_flowJobId` or a resource ID filter (`_exportId` / `_importId`).
50
53
  Returns the export/import sub-jobs within a parent flow job.
51
54
 
55
+ Job reads are authorized per integration. For a caller with
56
+ integration-only access (an account share that populates
57
+ `integrationAccessLevel` and omits `accessLevel`), a parent-job query
58
+ scoped by `_flowId` alone (`type=flow` or `type=retry`) fails with `400`
59
+ `query_param_required` ("Please provide the integration _id for which you
60
+ want to fetch the jobs"); it succeeds once `_integrationId` is sent beside
61
+ `_flowId`. Account-level callers may scope by `_flowId` alone, but that
62
+ path resolves the flow document first, so the jobs of a deleted flow come
63
+ back only when `_integrationId` is sent. Send the flow's `_integrationId`
64
+ together with `_flowId` whenever the flow document carries one — a flow
65
+ in the account's "Standalone flows" integration sends that integration's
66
+ id; only a legacy flow whose `_integrationId` is `null` has none to send.
67
+
52
68
  Date filters accept ISO 8601, plain date, or epoch milliseconds. When
53
69
  combining `numError_gte`/`numError_lte` with `_integrationId`, use full
54
70
  ISO 8601 with millis (plain-date format may be rejected). To page
@@ -67,7 +83,12 @@ paths:
67
83
  x-celigo-refModel: integrations
68
84
  examples:
69
85
  - 6842261335b64c0bcb308e4f
70
- description: Filter by integration ID. Satisfies the required-param check.
86
+ description: |-
87
+ Filter by integration ID. Satisfies the required-param check. Callers
88
+ with integration-only access must send it beside `_flowId` on
89
+ `type=flow` and `type=retry` queries — `_flowId` alone is refused
90
+ there. A value that is not the flow's integration returns no jobs
91
+ rather than an error.
71
92
  - name: _exportId
72
93
  in: query
73
94
  schema:
@@ -91,7 +112,13 @@ paths:
91
112
  x-celigo-refModel: flows
92
113
  examples:
93
114
  - 69f54d6b7009ea11abad707a
94
- description: Filter by flow ID. Satisfies the required-param check.
115
+ description: |-
116
+ Filter by flow ID. Satisfies the required-param check for
117
+ account-level callers; callers with integration-only access must
118
+ also send `_integrationId` on `type=flow` and `type=retry` queries.
119
+ On its own it resolves the flow document
120
+ first, so it returns nothing for a flow that no longer exists — pair
121
+ it with `_integrationId` to read a deleted flow's jobs.
95
122
  - name: _flowJobId
96
123
  in: query
97
124
  schema:
@@ -312,6 +339,12 @@ paths:
312
339
  errors:
313
340
  - code: invalid_query
314
341
  message: For child jobs, query parameters must contain either "_flowJobId" or "resourceId"
342
+ integration_only_caller_missing_integration_id:
343
+ summary: Integration-only caller queried by _flowId without _integrationId
344
+ value:
345
+ errors:
346
+ - code: query_param_required
347
+ message: Please provide the integration _id for which you want to fetch the jobs.
315
348
  invalid_status:
316
349
  summary: Invalid status enum value
317
350
  value:
package/dist/tool.yml CHANGED
@@ -24812,7 +24812,8 @@ components:
24812
24812
  Handlebars template that generates a concurrency lock key for each record: records that
24813
24813
  render the same key are never submitted at the same time, while records with different
24814
24814
  keys are processed in parallel. When omitted, the record's trace key is the lock key (a
24815
- blank trace key means no lock); a template replaces that default rather than adding to it.
24815
+ blank trace key means no lock; a custom `traceKeyTemplate` upstream arrives on the record
24816
+ as `io_custom_trace_key`); a template replaces that default rather than adding to it.
24816
24817
  The template is rendered from the record as it arrives at the import — before the import's
24817
24818
  own lookups and mapping run — so a key built from one of the import's lookup results
24818
24819
  (`{{lookup.<name>}}`) or from a mapped field renders empty, and an empty key is no lock at
@@ -36956,11 +36957,25 @@ components:
36956
36957
  Handlebars template that overrides how each record's unique trace key is generated, used
36957
36958
  to track records through the flow and match retries to prior errors (e.g.
36958
36959
  `{{join "_" record.customerId record.orderId}}`). When omitted, the system picks a unique
36959
- field automatically. If a transform reshapes the data first, omit the `record.` prefix.
36960
- Trace keys are capped at 256 characters; a longer key is stored truncated from the middle,
36961
- keeping the beginning and end of the value. Downstream imports use the trace key as their
36962
- default concurrency lock key (a blank key means no lock); it never de-duplicates — a record
36963
- emitted twice with the same key is processed twice.
36960
+ field automatically from the record's top level, by exact field name (`GET
36961
+ /v1/flows/{_id}/traceKey` serves the pattern). The rendered value of a template is stamped
36962
+ on each record as `io_custom_trace_key` and travels downstream with it. If a transform
36963
+ reshapes the data first, omit the `record.` prefix. Trace keys are capped at 256 characters;
36964
+ a longer key is stored truncated from the middle, keeping the beginning and end of the
36965
+ value. Downstream imports use the trace key as their default concurrency lock key (a blank
36966
+ key means no lock); it never de-duplicates — a record emitted twice with the same key is
36967
+ processed twice.
36968
+ x-celigo-ai-guidance:
36969
+ - |-
36970
+ The default derivation reads these top-level fields in order and takes the first present
36971
+ (a record carrying `id` and `internalId` is keyed on `id` alone) — `id`, `Id`, `ID`,
36972
+ `internalid`, `Internalid`, `internalId`, `InternalId`, `INTERNALID`, `_id`, `_Id`, `_ID`,
36973
+ `internal_id`, `internal_Id`, `Internal_id`, `Internal_Id`, `INTERNAL_ID`, `identifier`,
36974
+ `IDENTIFIER` — then a `*anything` rule the platform does not document.
36975
+ - |-
36976
+ A record in flight through the flow carries `io_custom_trace_key` when a template is set
36977
+ — that value is the downstream imports' default lock key; without a template the record
36978
+ carries no trace-key field (the key is derived, not stored on the record).
36964
36979
  examples:
36965
36980
  - '{{record.id}}'
36966
36981
  - '{{join "_" record.customerId record.orderId}}'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@celigo/api-specs",
3
- "version": "0.2.114",
3
+ "version": "0.2.116",
4
4
  "private": false,
5
5
  "description": "Public OpenAPI bundles (dist/) and the celigo-cli lint schema pack (schemas.json).",
6
6
  "keywords": [
package/schemas.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "provenance": {
3
3
  "repo": "celigo/integrator-api-specs",
4
- "iasCommit": "433e7903",
4
+ "iasCommit": "2cbeaf8b",
5
5
  "generatedAt": "2026-10-15"
6
6
  },
7
7
  "roots": {