> For the complete documentation index, see [llms.txt](https://developer.celigo.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://developer.celigo.com/api/api-reference/connections-and-http-connectors/http-connectors.md).

# HTTP Connectors

HTTP Connectors define reusable API frameworks — base URIs, versioning strategies, authentication presets, and supported-by rules — that HTTP connections, iClients, imports, and exports inherit.

Each connector has one or more versions and may group multiple API products under `apis[]`. Child resources (HTTP Connector Resources and Endpoints) define the specific operations available.

Two structural patterns exist:

* **Flat** — versions and baseURIs sit directly on the connector. Most connectors use this pattern.
* **Grouped** — the connector nests API products under `apis[]`, each with its own versions and baseURIs.

### HTTP connector schema

## The HTTPConnector object

````json
{"openapi":"3.2.0","info":{"title":"HTTP Connectors","version":"1.0.0"},"components":{"schemas":{"HTTPConnector":{"type":"object","required":["_id","_userId","name","createdAt","lastModified"],"description":"HTTP Connector object as returned by the detail (by-ID) endpoint.","allOf":[{"$ref":"#/components/schemas/HTTPConnectorBase"},{"$ref":"#/components/schemas/ResourceResponse"},{"type":"object","properties":{"_userId":{"type":"string","format":"objectId","description":"User who created this connector.","readOnly":true},"legacyIds":{"type":"array","description":"All legacy assistant IDs associated with this connector.","readOnly":true,"items":{"type":"string"}},"supportsIClient":{"type":"boolean","description":"When true, this connector supports shared iClient credentials.","readOnly":true},"supportsWebhook":{"type":"boolean","description":"When true, this connector supports webhook-based exports.","readOnly":true},"hasBlobEndpoints":{"type":"boolean","description":"When true, at least one endpoint under this connector handles binary/blob data.","readOnly":true},"metadataLoadStrategy":{"type":"string","enum":["staged"],"readOnly":true,"description":"Present only when the connector uses staged metadata loading. Omitted\nwhen the stored strategy is `full`."},"__numOfBlobEndpoints":{"type":"number","description":"Number of blob endpoints for this connector","readOnly":true},"httpConnectorResources":{"type":"array","readOnly":true,"description":"Only present on GET /v1/httpconnectors/{_id} with a non-empty\n`returnEverything`, and empty unless it is exactly `true`. The\nconnector's resources, sorted by `_id`: the same set\n`GET /v1/httpconnectors/{_httpConnectorId}/httpconnectorresources` lists.","items":{"$ref":"#/components/schemas/HTTPConnectorResource"}},"httpConnectorEndpoints":{"type":"array","readOnly":true,"description":"Only present on GET /v1/httpconnectors/{_id} with a non-empty\n`returnEverything`, and empty unless it is exactly `true`. The\nendpoints of the returned resources, grouped in resource order.","items":{"$ref":"#/components/schemas/HTTPConnectorEndpoint"}},"metadata":{"type":"object","readOnly":true,"description":"Connector metadata used by Data Intelligence tooling. Returned\nonly by the detail (by-ID) endpoint — list responses omit it.","properties":{"di":{"type":"object","description":"Data Intelligence attributes for this connector.","properties":{"isSourceOnboard":{"type":"boolean","description":"When true, the connector is onboarded as a Data Intelligence source."},"apiResolution":{"type":"object","description":"Which API group and version Data Intelligence resolves this\nconnector to. Present only on connectors with multiple API\ngroups or versions.","properties":{"api":{"type":"string","description":"Name of the resolved API group."},"version":{"type":"string","description":"Name of the resolved version."}}}}}}}}}]},"HTTPConnectorBase":{"type":"object","description":"Writable fields shared by the request and response schemas.","properties":{"name":{"type":"string","description":"Display name for this HTTP Connector.","maxLength":255},"published":{"type":"boolean","description":"When true, this connector is visible to users."},"baseURIs":{"type":"array","description":"Base URI templates (used when `apis` is empty).","items":{"type":"string"}},"helpURL":{"type":"string","description":"Documentation URL shown to users when configuring this connector."},"legacyId":{"type":"string","description":"Legacy assistant ID for backward compatibility."},"isGraphQL":{"type":"boolean","description":"When true, this connector targets a GraphQL API."},"requireBodyMatchForLinking":{"type":"boolean","description":"Require request body matching when auto-linking exports/imports."},"disableAutoLinking":{"type":"boolean","description":"Disable automatic linking of exports/imports to this connector."},"versioning":{"$ref":"#/components/schemas/Versioning"},"versions":{"type":"array","description":"Connector versions (used when `apis` is empty).","items":{"$ref":"#/components/schemas/Version"}},"apis":{"type":"array","description":"API groups under this connector. Each group has its own versions, baseURIs, and supportedBy config.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for this API group."},"name":{"type":"string","description":"Display name for this API group."},"description":{"type":"string","maxLength":10240,"description":"Explains what this API group covers, shown to users when selecting an API."},"published":{"type":"boolean","description":"When true, this API group is visible to users."},"baseURIs":{"type":"array","description":"Base URI templates used for requests targeting this API group.","items":{"type":"string"}},"helpURL":{"type":"string","description":"Documentation URL shown to users when configuring this API group."},"legacyId":{"type":"string","description":"Legacy assistant ID for backward compatibility."},"isGraphQL":{"type":"boolean","description":"When true, this API group targets a GraphQL API."},"versioning":{"$ref":"#/components/schemas/Versioning"},"versions":{"type":"array","description":"Versions available under this API group.","items":{"$ref":"#/components/schemas/Version"}},"supportedBy":{"$ref":"#/components/schemas/SupportedBy"},"setDefault":{"type":"boolean","description":"When true, this API group is the connector's default selection."}}}},"supportedBy":{"allOf":[{"$ref":"#/components/schemas/SupportedBy"}]},"preBuiltExports":{"type":"array","description":"Pre-built export templates associated with this connector.","items":{"type":"object","properties":{"_exportId":{"type":"string","format":"objectId","description":"Export resource that serves as the pre-built template."},"published":{"type":"boolean","description":"When true, this pre-built export is visible to users."}},"required":["_exportId"]}},"preBuiltImports":{"type":"array","description":"Pre-built import templates associated with this connector.","items":{"type":"object","properties":{"_importId":{"type":"string","format":"objectId","description":"Import resource that serves as the pre-built template."},"published":{"type":"boolean","description":"When true, this pre-built import is visible to users."}},"required":["_importId"]}}}},"Versioning":{"type":"object","description":"Strategy for how API versions are passed in requests. Used at the\nconnector level and per API group; both use the same shape.","properties":{"location":{"type":"string","enum":["uri","query_parameter","header"],"description":"Where the version identifier is placed in outgoing requests."},"headerName":{"type":"string","description":"Header name when `location` is `header`."},"queryParameterName":{"type":"string","description":"Query parameter name when `location` is `query_parameter`."}}},"Version":{"type":"object","description":"A version of the connector (or of an API group). Both contexts use the\nsame shape.","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for this version."},"name":{"type":"string","description":"Display name for this version (e.g. `v3`)."},"published":{"type":"boolean","description":"When true, this version is visible to users."},"baseURIs":{"type":"array","description":"Base URI templates used for requests targeting this version.","items":{"type":"string"}},"supportedBy":{"$ref":"#/components/schemas/SupportedBy"}}},"SupportedBy":{"type":"object","description":"Framework-defined defaults that pre-configure fields and prompt users\nwhen a connection, export, import, or iClient is created from this\nconnector (or from a specific version / API group).","properties":{"connection":{"$ref":"#/components/schemas/SupportedBySection"},"export":{"$ref":"#/components/schemas/SupportedBySection"},"import":{"$ref":"#/components/schemas/SupportedBySection"},"iClient":{"$ref":"#/components/schemas/SupportedBySection"}}},"SupportedBySection":{"type":"object","description":"Conditions, pre-configured field values, and fields the user must set\nfor one resource type (connection, export, import, or iClient) when it\nis created from this connector. All four sections share this shape.","properties":{"preConfiguredFields":{"type":"array","description":"Fields automatically set on the target resource. Not editable by the user.","items":{"$ref":"#/components/schemas/SupportedByPreConfiguredField"}},"fieldsUserMustSet":{"type":"array","description":"Fields the user must provide values for when creating the target resource.","items":{"$ref":"#/components/schemas/SupportedByFieldUserMustSet"}},"fieldsToUnset":{"type":"array","description":"Field paths to clear on the target resource."},"conditions":{"type":"array","description":"Expression-based filters referenced by `_conditionIds` in\n`preConfiguredFields` and `fieldsUserMustSet` to conditionally\napply those field configurations.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for this condition, referenced by `_conditionIds` in field entries."},"condition":{"$ref":"#/components/schemas/Filter"}}}}}},"SupportedByPreConfiguredField":{"type":"object","description":"A field automatically set to a predefined value on the target resource.","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for this field entry."},"path":{"type":"string","description":"Dot-notation path of the field on the target resource."},"values":{"type":"array","description":"Value(s) to assign. Typically a single-element array; entries may be\nany JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this field to apply. If absent, always applies.","items":{"type":"string","format":"objectId"}}}},"SupportedByFieldUserMustSet":{"type":"object","description":"A field the user must provide a value for when creating the target resource.","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for this field entry."},"path":{"type":"string","description":"Dot-notation path of the field on the target resource."},"values":{"type":"array","description":"Optional suggested or constrained values. Entries may be any JSON\ntype."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this field to apply.","items":{"type":"string","format":"objectId"}},"helpURL":{"type":"string","description":"URL to documentation for this field."},"labelOverride":{"type":"string","description":"Custom label to display in the UI instead of the default."},"inputType":{"type":"string","enum":["number","password","uri"],"description":"UI input widget type shown when prompting the user for this field.\nUses the same widget vocabulary as Trading Partner Connectors."}}},"Filter":{"type":"object","description":"Configuration for selectively processing records based on specified criteria. This object enables\nprecise control over which items are included or excluded from processing operations.\n\n**Filter behavior**\n\nWhen configured, the filter is applied before processing begins:\n- Items that match the filter criteria are processed\n- Items that don't match are completely skipped\n- No partial processing is performed\n\nSend the whole object. A rules array sent alone as the `filter` value is not\nstored, and a full update of an export that carries one removes the filter the\nexport had, with no error.\n\n**Implementation approaches**\n\nThere are two distinct filtering mechanisms available:\n\n**Rule-Based Filtering (`type: \"expression\"`)**\n- **Best For**: Common filtering patterns based on standard attributes\n- **Capabilities**: Filter by names, values, dates, numerical ranges, text patterns\n- **Advantages**: Declarative, no coding required, consistent performance\n- **Configuration**: Define rules in the `expression` object\n- **Use When**: You have clear, static criteria for selection\n\n**Script-Based Filtering (`type: \"script\"`)**\n- **Best For**: Complex logic, dynamic criteria, or business rules\n- **Capabilities**: Full programmatic control, access to complete metadata\n- **Advantages**: Maximum flexibility, can implement any filtering logic\n- **Configuration**: Reference a script in the `script` object\n- **Use When**: Simple rules aren't sufficient or logic needs to be dynamic\n","properties":{"type":{"type":"string","description":"Determines which filtering mechanism to use. This choice affects which properties\nmust be configured and how filtering logic is implemented.\n\n**Available types**\n\n**Rule-Based Filtering (`\"expression\"`)**\n- **Required Config**: The `expression` object with rule definitions\n- **Behavior**: Evaluates declarative rules against item attributes\n- **Best For**: Common patterns like name matching, date ranges, value limits\n- **Advantages**: Simpler to configure, no custom code required\n\n**Script-Based Filtering (`\"script\"`)**\n- **Required Config**: The `script` object with _scriptId and function\n- **Behavior**: Executes custom JavaScript to determine which items to process\n- **Best For**: Complex conditions, business logic, dynamic criteria\n- **Advantages**: Maximum flexibility, can implement any logic\n\n**Implementation guidance**\n\n1. For standard filtering needs (name, size, date), use `\"expression\"`\n2. For complex logic or conditions not covered by expressions, use `\"script\"`\n3. When selecting a type, you must configure the corresponding object:\n    - `type: \"expression\"` requires the `expression` object\n    - `type: \"script\"` requires the `script` object\n","enum":["expression","script"]},"expression":{"type":"object","description":"Configuration for declarative rule-based filtering. This object enables filtering\nitems based on common attributes without requiring custom code.\n\n**Usage context**\n\nThis object is REQUIRED when `filter.type` is set to \"expression\" and should not be\nconfigured otherwise. It provides a standardized way to define filtering rules that\ncan match against item attributes like name, type, value, date, and other properties.\n\n**Implementation guidance**\n\nThe expression system uses a rule-based approach where:\n- Rules can be combined with AND/OR logic\n- Each rule can check a specific attribute\n- Multiple conditions can be applied (ranges, pattern matching, exact matches)\n\n**Common filter patterns**\n\n1. **Pattern matching**: Regular expressions with `matches`\n2. **Value range filtering**: Numbers between min and max values\n3. **Date range filtering**: Items created/modified within specific time ranges\n4. **Status checking**: Items with specific status values or properties\n\nFor AI agents: Rule-based filtering should be your first choice when the filtering criteria\ncan be expressed in terms of standard attributes. Only use script-based filtering when\nmore complex logic is required.\n","properties":{"version":{"type":"string","description":"Version identifier for the expression format. Currently only version \"1\" is supported.\n\nThis field ensures future compatibility if the expression format evolves. Always set to \"1\"\nfor current implementations.\n","enum":["1"]},"rules":{"type":"array","description":"Expression array defining filter conditions using prefix notation. The first element is the operator,\nfollowed by its operands which may themselves be nested expression arrays.\n\nThe rule expression follows this pattern:\n- First element: Operator name (string)\n- Remaining elements: Operands for that operator (values or nested expressions)\n\n**Expression structure**\n\nFilter expressions use a prefix notation where operators appear before their operands:\n```\n[operator, operand1, operand2, ...]\n```\n\n**Comparison Operators**\n- `\"equals\"`: Exact match (equals)\n- `\"notequals\"`: Not equal to value (not equals)\n- `\"greaterthan\"`: Value is greater than specified value (is greater than)\n- `\"greaterthanequals\"`: Value is greater than or equal to specified value (is greater than or equals)\n- `\"lessthan\"`: Value is less than specified value (is less than)\n- `\"lessthanequals\"`: Value is less than or equal to specified value (is less than or equals)\n- `\"startswith\"`: String starts with specified prefix (starts with)\n- `\"notstartswith\"`: String does not start with specified prefix (does not start with)\n- `\"endswith\"`: String ends with specified suffix (ends with)\n- `\"notendswith\"`: String does not end with specified suffix (does not end with)\n- `\"contains\"`: String contains specified substring (contains)\n- `\"doesnotcontain\"`: String does not contain specified substring (does not contain)\n- `\"empty\"`: Field is missing or empty (is empty)\n- `\"notempty\"`: Field contains a value (is not empty)\n- `\"matches\"`: Matches a regular expression, ignoring case (matches)\n\nOperator names are case-insensitive: `NOTEMPTY` and `endsWith` work and are stored\nas sent. `isempty`, `isnotempty`, `anyof`, `notcontains`, `doesnotstartwith`,\n`doesnotendwith`, `notmatches`, `doesnotmatch` and `notequal` are not operators:\nthey are refused with 422 \"Invalid operation: <name>\", with the name in lowercase,\nboth when the filter is saved and by `POST /v1/processors/filter`. To negate a\ncondition, wrap it in `not`.\n\nThe string comparisons (`equals`, `contains`, `startswith`, `endswith` and their\nnegations) are case-sensitive; wrap the field in `lowercase` to compare without case.\n`matches` is not: every pattern is compiled with the flags `gi`, so `^paid$` also\nmatches `PAID` and `[a-z]` matches capital letters. An inline flag such as `(?i)`\nmakes the pattern invalid. The filter still saves, but in a run every record fails\nwith `FILTER_EVALUATION_FAILED` (\"Invalid regular expression: /(?i)…/gi: Invalid\ngroup\"), and `POST /v1/processors/filter` refuses the call with 422 (live-verified\n2026-10-22).\n\n**Logical Operators**\n- `\"and\"`: All conditions must be true\n- `\"or\"`: At least one condition must be true\n- `\"not\"`: Negates the condition\n\n**Field Access and Type Conversion**\n- `\"extract\"`: Access a field from the item by name\n- `\"settings\"`: Access a custom setting from the flow, flow step, or integration configuration\n- `\"boolean\"`: Convert value to Boolean type\n- `\"epochtime\"`: Convert value to Epoch Time (Unix timestamp)\n- `\"number\"`: Convert value to Number type\n- `\"string\"`: Convert value to String type\n\n**Field Access Details**\n\n**Using `extract` to access record fields:**\n- Retrieves values from the current record being processed\n- Can access nested properties using dot notation (e.g., `\"customer.email\"`)\n- Paths are relative to the record itself: `[\"extract\", \"record.status\"]`\n  matches nothing\n- In a record filter, must be wrapped in a type conversion (`string`, `number`,\n  `boolean` or `epochtime`): a bare `[\"extract\", ...]` operand is refused with 422\n  \"Field operation extract must be called by a Type Conversion Operation but was called\n  by <operator>\", both when an import's filter is saved and by\n  `POST /v1/processors/filter`\n\n**Using `settings` to access configuration values:**\n- Retrieves values from the integration's configuration settings\n- Supports different scopes with prefix notation:\n  - `flow.settingName`: Access flow-level settings\n  - `flowGrouping.settingName`: Access the flow group's settings\n  - `export.settingName`: Access the export's (or lookup's) own settings\n  - `import.settingName`: Access the import's own settings\n  - `integration.settingName`: Access integration-level settings\n  - `connection.settingName`, `iClient.settingName`: Access the step's\n    connection and iClient settings\n- A scope whose resource has no settings can be absent; a rule that reads\n  it matches nothing\n- Must be wrapped in a type conversion like `extract`: a bare\n  `[\"settings\", ...]` operand is refused with 422 \"Field operation settings\n  must be called by a Type Conversion Operation\"\n- Useful for dynamic filtering based on configuration\n\n**Field Transformations**\n- `\"lowercase\"`: Convert string to lowercase\n- `\"uppercase\"`: Convert string to uppercase\n- `\"ceiling\"`: Round number up to the nearest integer\n- `\"floor\"`: Round number down to the nearest integer\n- `\"abs\"`: Get absolute value of a number\n\n**Arithmetic** (number operands)\n- `\"add\"`, `\"subtract\"`, `\"multiply\"`, `\"divide\"`, `\"modulo\"`: for example\n  `[\"subtract\", [\"number\", [\"extract\", \"total\"]], [\"number\", [\"extract\", \"discount\"]]]`.\n  `mod` is not an operator (422 \"Invalid operation: mod.\").\n\n**Dates**\n- `epochtime` reads ISO 8601 strings and epoch-millisecond numbers. An empty\n  string, a string that isn't a date, or epoch milliseconds sent as a string\n  fail it with \"Invalid date. Cannot convert given string or number to date\n  time.\", followed by `; record=` and the record as JSON: in a run that record fails (`FILTER_EVALUATION_FAILED`, source\n  `output_filter` on an export), and `POST /v1/processors/filter` and an\n  export preview refuse the whole call with 422. `and` and `or` evaluate\n  every operand, so a `notempty` test beside it doesn't prevent the failure.\n  A missing or null field doesn't match.\n- `datetime`, `date` and `timestamp` are not type conversions: 422\n  \"Invalid operation: <name>.\"\n- `number` reads a missing or empty field as 0.\n\n**Handlebars operands**\n- An operand can also be a string holding exactly one Handlebars expression, such as\n  `\"{{record.status}}\"` or `\"{{lowercase record.code}}\"`, on either side of the\n  operator. It renders against the record (`record.<field>`; an unprefixed\n  `{{status}}` renders empty) before the comparison.\n- The rendered value is a string: wrap it in `[\"number\", ...]` to compare it with a\n  number, or the rule is refused with 422.\n- `epochtime` does not render Handlebars: `[\"epochtime\", \"{{timestamp}}\"]` is refused\n  with 422 \"invalid datetime format\".\n- A string with text around the expression, or with more than one expression, is\n  compared as a literal.\n- `[\"number\", \"{{timestamp \\\"x\\\"}}\"]` is the current time in epoch milliseconds,\n  so `[\"greaterthanequals\", [\"epochtime\", [\"extract\", \"created\"]], [\"subtract\",\n  [\"number\", \"{{timestamp \\\"x\\\"}}\"], 604800000]]` keeps records created in the\n  last 7 days.\n- An unknown helper fails the rule with 422 \"Failed to evaluate handlebars\n  expression\".\n\nChoose the type conversion that matches the comparison — `number` for numeric\ncomparisons, `epochtime` for dates, `string` for text. For example:\n\n```json\n[\n  \"equals\",\n  [\n    \"number\",  // Convert to number before comparison\n    [\n      \"extract\",\n      \"quantity\"\n    ]\n  ],\n  100\n]\n```\n\nExample with datetime conversion:\n```json\n[\n  \"greaterthan\",\n  [\n    \"epochtime\",  // Convert to Unix timestamp before comparison\n    [\n      \"extract\",\n      \"createdDate\"\n    ]\n  ],\n  1609459200000  // January 1, 2021 as Unix timestamp in milliseconds\n]\n```\n\nExample with transformations:\n```json\n[\n  \"and\",\n  [\n    \"matches\",\n    [\n      \"lowercase\",  // Convert to lowercase before matching\n      [\n        \"string\",\n        [\n          \"extract\",\n          \"categories\"\n        ]\n      ]\n    ],\n    \"netsuite\"\n  ],\n  [\n    \"notequals\",\n    [\n      \"string\",\n      [\n        \"extract\",\n        \"recurrence.pattern.type\"\n      ]\n    ],\n    \"\"\n  ]\n]\n```\n\nExample comparing a record field with a flow setting:\n```json\n[\n  \"equals\",\n  [\n    \"string\",\n    [\n      \"extract\",\n      \"trantype\"\n    ]\n  ],\n  [\n    \"string\",\n    [\n      \"settings\",\n      \"flow.trantype\"\n    ]\n  ]\n]\n```\n\n**Examples**\n\nExample 1: Status field is not equal to \"cancelled\"\n```json\n[\n  \"notequals\",\n  [\n    \"string\",\n    [\n      \"extract\",\n      \"status\"\n    ]\n  ],\n  \"cancelled\"\n]\n```\n\nExample 2: Filename starts with \"HC\"\n```json\n[\n  \"startswith\",\n  [\n    \"string\",\n    [\n      \"extract\",\n      \"filename\"\n    ]\n  ],\n  \"HC\"\n]\n```\n\nExample 3: Amount is greater than 100\n```json\n[\n  \"greaterthan\",\n  [\n    \"number\",\n    [\n      \"extract\",\n      \"amount\"\n    ]\n  ],\n  100\n]\n```\n\nExample 4: Order date is after January 1, 2023 (UTC). Compare dates as `epochtime`\nagainst epoch milliseconds: a `string` comparison of ISO timestamps orders values with\ndifferent UTC offsets wrongly.\n```json\n[\n  \"greaterthan\",\n  [\n    \"epochtime\",\n    [\n      \"extract\",\n      \"orderDate\"\n    ]\n  ],\n  1672531200000\n]\n```\n","items":{"oneOf":[{"title":"String","type":"string"},{"title":"Number","type":"number"},{"title":"Boolean","type":"boolean"},{"title":"Object","type":"object"},{"title":"Array","type":"array"},{"title":"Null","type":"null"}]}}}},"script":{"type":"object","description":"Configuration for programmable script-based filtering. This object enables complex, custom\nfiltering logic beyond what expression-based filtering can provide.\n\n**Usage context**\n\nThis object is REQUIRED when `filter.type` is set to \"script\" and should not be configured\notherwise. It provides a way to execute custom JavaScript code to determine which items\nshould be processed.\n\n**Implementation approach**\n\nScript-based filtering works by:\n1. Executing the specified function from the referenced script\n2. Passing item data to the function\n3. Using the function's return value (true/false) to determine inclusion\n\n**Common use cases**\n\nScript filtering is ideal for:\n- Complex business logic that can't be expressed as simple rules\n- Dynamic filtering criteria that change based on external factors\n- Content-based filtering that requires deep inspection\n- Advanced pattern matching beyond simple wildcards\n- Multi-stage filtering with intermediate logic\n\nFor AI agents: Only use script-based filtering when expression-based filtering is insufficient.\nScript filtering requires maintaining custom code, which adds complexity to the integration.\n","properties":{"_scriptId":{"type":"string","description":"Reference to the Script resource that contains the filtering logic. This must be a valid\nObjectId of a Script resource in this account: any other id fails the save with 422\n(\"Only a script owned by the user or a script shared by the Integration App can be used\nat filter.script._scriptId.\").\n\nThe referenced script must contain the function specified in the `function` field\nand must be written to handle filtering specifically. The script receives\nitem data as its input and must return a boolean value indicating whether\nto process the item (true) or skip it (false).\n\nFormat: 24-character hexadecimal string (MongoDB ObjectId)\n"},"function":{"type":"string","description":"Name of the function within the script to execute for filtering decisions. This function\nmust exist in the script referenced by _scriptId.\n\n**Function requirements**\n\nThe specified function must:\n- Accept item data as its first parameter\n- Return a boolean value (true to process the item, false to skip it)\n- Handle errors gracefully\n- Execute efficiently (as it may run for many items)\n\n**Function signature**\n\n```javascript\nfunction filterItems(itemData) {\n  // itemData contains properties of the item being evaluated\n  // Custom logic here\n  return true; // or false to skip the item\n}\n```\n\nFor AI agents: Ensure the function name exactly matches a function defined in the\nreferenced script, as mismatches will cause the filter to fail.\n"}}}}},"ResourceResponse":{"type":"object","description":"Response","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for the resource. Format is a 24-character hexadecimal string."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was created. Set automatically and cannot be modified."},"lastModified":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was last updated. Changes whenever any property is modified."},"deletedAt":{"type":["string","null"],"format":"date-time","readOnly":true,"description":"Timestamp when the resource was soft-deleted. When null or absent, the resource is active."}},"required":["_id"]},"HTTPConnectorResource":{"type":"object","required":["_id","_httpConnectorId","name","published","createdAt","lastModified"],"description":"HTTP Connector Resource as returned by `GET /v1/httpconnectorresources`,\n`GET /v1/httpconnectorresources/{_id}`, and the nested\n`GET /v1/httpconnectors/{_httpConnectorId}/{_id}` — all three return the\nsame object. Optional fields that were never set are absent.","allOf":[{"$ref":"#/components/schemas/HTTPConnectorResourceBase"},{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for the resource. Doubles as the\n`_httpConnectorResourceId` path parameter of the HTTP Connector\nEndpoints API."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was created."},"lastModified":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was last updated. Changes on every PUT."}}}]},"HTTPConnectorResourceBase":{"type":"object","description":"Writable fields shared by the request and response schemas.","properties":{"name":{"type":"string","description":"Human-readable name of the API resource this grouping represents (for example \"Account\", \"Contact\", \"Order\")."},"published":{"type":"boolean","default":false,"description":"When true, the resource is visible to users of the connector's\npublished catalog. Only resources whose owner may publish HTTP\nconnectors appear to other accounts."},"_httpConnectorId":{"type":"string","format":"objectId","description":"HTTP Connector this resource belongs to. Must be a connector owned by\nthe caller's account."},"_httpConnectorApiId":{"type":"string","format":"objectId","description":"API group (an entry of the connector's `apis[]`) this resource belongs\nto. Set only for grouped connectors; flat connectors scope resources by\n`_versionIds` instead."},"_versionIds":{"type":"array","description":"Connector (or API group) versions this resource is available in. Each\nid must be one of the connector's `versions[]._id` values.","items":{"type":"string","format":"objectId"}},"_parentResourceId":{"type":"string","format":"objectId","description":"Parent resource when this resource is nested under another one (for\nexample \"Order line\" under \"Order\"). Omit for top-level resources;\ncannot be combined with `isRoot: true`."},"isRoot":{"type":"boolean","default":false,"description":"When true, marks the resource as the root of a resource hierarchy.\nRejected together with `_parentResourceId`."},"metadata":{"type":"object","additionalProperties":true,"description":"Free-form metadata stored with the resource, for example Data Intelligence attributes."},"resourceFields":{"type":"array","description":"Field catalog of the records this resource returns, used by tooling to\ndescribe the API's payloads. Fields nest through their own\n`resourceFields`.","items":{"$ref":"#/components/schemas/ResourceField"}},"supportedBy":{"$ref":"#/components/schemas/ResourceSupportedBy"}}},"ResourceField":{"type":"object","description":"One field of the resource's records, optionally with nested child fields.","required":["id"],"properties":{"id":{"type":"string","description":"Field identifier as it appears in the record."},"label":{"type":"string","description":"Display label for the field."},"description":{"type":"string","description":"Help text describing the field."},"dataType":{"type":"string","description":"Data type label for the field, stored as given."},"metadata":{"type":"object","additionalProperties":true,"description":"Free-form metadata for the field."},"resourceFields":{"type":"array","description":"Child fields of an object or array field. Absent when the field is scalar.","items":{"type":"object","additionalProperties":true,"description":"Nested field with the same shape as its parent."}}}},"ResourceSupportedBy":{"type":"object","description":"Defaults the connector framework applies when a user builds an export or\nan import on one of this resource's endpoints. Each section\npre-configures fields, lists the fields the user must still fill in, and\nclears fields that do not apply.","properties":{"export":{"$ref":"#/components/schemas/ResourceSupportedBySection"},"import":{"allOf":[{"$ref":"#/components/schemas/ResourceSupportedBySection"},{"type":"object","properties":{"pathParameterToIdentifyExisting":{"type":"string","description":"Path parameter whose value identifies the existing record on\nan update or upsert import. Needed only when the endpoint has\nmore than one path parameter."},"lookupToIdentifyExisting":{"type":"object","description":"Lookup the import runs to find out whether a record already\nexists before deciding between create and update. Both\nfields go together — sending one without the other is\nrejected.","properties":{"_httpConnectorEndpointId":{"type":"string","format":"objectId","description":"HTTP Connector Endpoint that performs the lookup. Must be\nan existing endpoint."},"extract":{"type":"string","description":"Path in the lookup response to read the existing record's identifier from."}}}}}]}}},"ResourceSupportedBySection":{"type":"object","description":"Conditions, pre-configured field values, required user inputs, and\nfields to clear for one resource type (export or import) created from\nthis resource.","properties":{"conditions":{"type":"array","description":"Expression-based filters referenced by `_conditionIds` in\n`preConfiguredFields` and `fieldsUserMustSet` to apply those entries\nconditionally.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Identifier of this condition, referenced by `_conditionIds` in field entries."},"condition":{"$ref":"#/components/schemas/Filter"}}}},"preConfiguredFields":{"type":"array","description":"Fields set automatically on the generated export or import. Not editable by the user.","items":{"type":"object","properties":{"path":{"type":"string","description":"Dot-notation name of the setting in the connector's form. It is not always a literal\npath on the generated export or import: a form group such as `response` takes an\nobject value (`{resourcePath: \"customers\"}`) that sets the step's\n`http.response.resourcePath`."},"values":{"type":"array","description":"Value(s) to assign. Typically a single-element array; entries may be any JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this entry to apply. Always applies when absent.","items":{"type":"string","format":"objectId"}}}}},"fieldsUserMustSet":{"type":"array","description":"Fields the user must provide values for on the generated export or import.","items":{"type":"object","properties":{"path":{"type":"string","description":"Dot-notation name of the setting the connector's form asks for: a step field such as\n`ignoreExisting` or `type`, or `mapping.fields.generate.<field>`, a destination field\nthe import's mapping must produce."},"values":{"type":"array","description":"Optional suggested or constrained values. Entries may be any JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this entry to apply.","items":{"type":"string","format":"objectId"}},"helpURL":{"type":"string","description":"URL to documentation for this field."},"labelOverride":{"type":"string","description":"Custom label shown in the UI instead of the default."}}}},"fieldsToUnset":{"type":"array","description":"Dot-notation paths to clear on the generated export or import.","items":{"type":"string"}}}},"HTTPConnectorEndpoint":{"type":"object","required":["_id","name","method","relativeURI","published","isBlob","isMappingRequired","mergePostBodyToPagingPostBody","_httpConnectorResourceIds","createdAt","lastModified"],"description":"HTTP Connector Endpoint as returned by `GET /v1/httpconnectorendpoints`,\n`GET /v1/httpconnectorendpoints/{_id}`, and the nested\n`GET /v1/httpconnectors/{_httpConnectorId}/{_httpConnectorResourceId}/{_id}`\n— all three return the same object. Optional fields that were never set\nare absent.","allOf":[{"$ref":"#/components/schemas/HTTPConnectorEndpointBase"},{"$ref":"#/components/schemas/ResourceResponse"},{"type":"object","properties":{"metadata":{"type":"object","description":"Endpoint metadata used by Data Intelligence tooling. Absent when\nnever set; Data Intelligence attributes can only be stored on a\npublished endpoint.","properties":{"di":{"type":"object","description":"Data Intelligence attributes for this endpoint.","properties":{"isListEndpoint":{"type":"boolean","description":"When true, the endpoint returns a list of records rather than a single record."},"responseFields":{"type":"array","description":"Fields Data Intelligence expects in this endpoint's response records.","items":{"type":"object","properties":{"id":{"type":"string","description":"Field path within a response record."},"dataType":{"type":"string","description":"Data type of the field."}}}}}}}}}}]},"HTTPConnectorEndpointBase":{"type":"object","description":"Writable fields shared by the request and response schemas.","properties":{"name":{"type":"string","description":"Human-readable name for this endpoint, shown when users pick an operation.","maxLength":255},"description":{"type":"string","description":"Help text describing what the endpoint does. Absent when never set.","maxLength":10240},"published":{"type":"boolean","default":false,"description":"When true, this endpoint is visible in the connector's published\ncatalog. Kept as stored when omitted on PUT."},"isBlob":{"type":"boolean","default":false,"description":"When true, this endpoint transfers binary (blob) content instead of records. Kept as stored when omitted on PUT."},"isMappingRequired":{"type":"boolean","default":false,"description":"When true, users must configure field mappings before an import built on this endpoint can run."},"_httpConnectorResourceIds":{"type":"array","minItems":1,"description":"HTTP Connector Resources this endpoint is listed under. Each id must\nbe a resource owned by the caller's account; the endpoint appears in\nthe nested listing of every resource named here.","items":{"type":"string","format":"objectId"}},"method":{"type":"string","enum":["GET","PUT","POST","PATCH","DELETE","HEAD"],"description":"HTTP method for this endpoint. Required on save; lowercase input is\nuppercased automatically."},"relativeURI":{"type":"string","description":"Relative URI template for this endpoint"},"mergePostBodyToPagingPostBody":{"type":"boolean","description":"When true, merges the postBody into pagingPostBody for paginated requests.","default":false},"queryParameters":{"type":"array","description":"Query parameter definitions","items":{"type":"object","properties":{"name":{"type":"string","description":"Parameter name as it appears in the request query string."},"label":{"type":"string","description":"Label shown to users in the UI for this parameter. Defaults to `name` when omitted."},"description":{"type":"string","description":"Help text shown to users explaining what this parameter does."},"required":{"type":"boolean","description":"When true, the user must supply a value for this parameter."},"dataType":{"type":"string","enum":["input","date","select","multiselect","array","number"],"default":"input","description":"UI input type used to collect the parameter value. A free-form text input when omitted."},"values":{"type":"array","description":"Predefined values offered when `dataType` is `select` or `multiselect`.","items":{"type":"string"}}},"required":["name"]}},"pathParameters":{"type":"array","description":"Path parameter definitions","items":{"type":"object","properties":{"name":{"type":"string","description":"Parameter name as it appears in the `relativeURI` template."},"label":{"type":"string","description":"Label shown to users in the UI for this parameter. Defaults to `name` when omitted."},"description":{"type":"string","description":"Help text shown to users explaining what this parameter does."},"required":{"type":"boolean","description":"When true, the user must supply a value for this parameter."},"dataType":{"type":"string","enum":["input","date","select","multiselect","array","number"],"default":"input","description":"UI input type used to collect the parameter value. A free-form text input when omitted."},"values":{"type":"array","description":"Predefined values offered when `dataType` is `select` or `multiselect`.","items":{"type":"string"}}},"required":["name"]}},"resourceFields":{"type":"array","description":"Resource field definitions for this endpoint","items":{"type":"object","properties":{"type":{"type":"string","enum":["inclusion","exclusion"],"description":"Whether `fields` lists the fields to include or to exclude."},"fields":{"type":"array","description":"Field names the inclusion or exclusion rule applies to.","items":{"type":"string"}},"_httpConnectorResourceId":{"type":"string","format":"objectId","description":"HTTP Connector Resource these field rules apply to."}},"required":["type","fields","_httpConnectorResourceId"]}},"supportedBy":{"type":"object","description":"How the connector framework turns this endpoint into an export or an\nimport: which one it becomes, the fields it pre-configures, and the\nfields the user must still fill in. Each entry's `path` names a setting\nin the connector's form, which is not always a literal path on the\ngenerated export or import.","required":["type"],"properties":{"type":{"type":"string","enum":["import","export"],"description":"Whether this endpoint is consumed as an import or an export. Also\nthe value the nested listing's `supportedByType` filter matches."},"conditions":{"type":"array","description":"Expression-based filters that control when entries in `preConfiguredFields` and `fieldsUserMustSet` apply.","items":{"type":"object","additionalProperties":true}},"preConfiguredFields":{"type":"array","description":"Fields automatically set to predefined values on the generated export or import. Not editable by the user.","items":{"type":"object","additionalProperties":true}},"fieldsUserMustSet":{"type":"array","description":"Fields the user must provide values for on the generated export or import.","items":{"type":"object","additionalProperties":true}},"fieldsToUnset":{"type":"array","description":"Dot-notation paths of fields to remove from the generated export or import configuration.","items":{"type":"string"}},"pathParameterToIdentifyExisting":{"type":"string","description":"Path parameter whose value identifies an existing record in the target application."},"lookupToIdentifyExisting":{"type":"object","description":"Lookup used to determine whether a record already exists in the target application.","properties":{"_httpConnectorEndpointId":{"type":"string","format":"objectId","description":"HTTP Connector Endpoint used to perform the lookup."},"extract":{"type":"string","description":"Path in the lookup response from which to extract the existing record's identifier."}}}}}}}}}}
````

## List HTTP connectors

> Returns all HTTP Connectors visible to the authenticated account.\
> The list response is abridged -- it omits \`published\`, \`baseURIs\`,\
> \`supportedBy\`, and other detail fields. Use the by-ID endpoint for\
> the full object.

```json
{"openapi":"3.2.0","info":{"title":"HTTP Connectors","version":"1.0.0"},"tags":[{"name":"HTTP Connectors","description":"HTTP Connectors define reusable API frameworks — base URIs, versioning\nstrategies, authentication presets, and supported-by rules — that\nHTTP connections, iClients, imports, and exports inherit.\n\nEach connector has one or more versions and may group multiple API\nproducts under `apis[]`. Child resources (HTTP Connector Resources\nand Endpoints) define the specific operations available.\n\nTwo structural patterns exist:\n- **Flat** — versions and baseURIs sit directly on the connector.\n  Most connectors use this pattern.\n- **Grouped** — the connector nests API products under `apis[]`,\n  each with its own versions and baseURIs.\n\n## HTTP connector schema\n\n{% openapi-schemas spec=\"httpconnector\" schemas=\"HTTPConnector\" grouped=\"true\" %}"}],"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"},{"url":"https://api.au.integrator.io","description":"Production (AU region)"},{"url":"https://api.ca.integrator.io","description":"Production (CA region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"ListItem":{"type":"object","description":"Abridged HTTP Connector returned in list responses. Omits `published`,\n`baseURIs`, `supportedBy`, `apis`, `versioning`, and write-only fields\ncompared to the detail endpoint.","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for the resource. Format is a 24-character hexadecimal string."},"name":{"type":"string","description":"Display name for this HTTP Connector."},"_userId":{"type":"string","format":"objectId","readOnly":true,"description":"User who created this connector."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was created. Set automatically and cannot be modified."},"lastModified":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was last updated. Changes whenever any property is modified."},"helpURL":{"type":"string","description":"Documentation URL shown to users when configuring this connector."},"legacyId":{"type":"string","description":"Legacy assistant ID for backward compatibility."},"legacyIds":{"type":"array","description":"All legacy assistant IDs associated with this connector.","items":{"type":"string"},"readOnly":true},"isGraphQL":{"type":"boolean","description":"When true, this connector targets a GraphQL API."},"supportsIClient":{"type":"boolean","readOnly":true,"description":"When true, this connector supports shared iClient credentials."},"supportsWebhook":{"type":"boolean","readOnly":true,"description":"When true, this connector supports webhook-based exports."},"hasBlobEndpoints":{"type":"boolean","readOnly":true,"description":"When true, at least one endpoint under this connector handles binary/blob data."},"metadataLoadStrategy":{"type":"string","enum":["staged"],"readOnly":true,"description":"Present only when the connector uses staged metadata loading. Omitted\nwhen the stored strategy is `full`."},"versions":{"type":"array","description":"Connector versions, abridged to identifiers and names.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","description":"Unique identifier for this version."},"name":{"type":"string","description":"Display name for this version (e.g. `v3`)."}}}},"apis":{"type":"array","description":"API groups under this connector, abridged to identifiers, names, and versions.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","description":"Unique identifier for this API group."},"name":{"type":"string","description":"Display name for this API group."},"versions":{"type":"array","description":"Versions available under this API group.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","description":"Unique identifier for this version."},"name":{"type":"string","description":"Display name for this version (e.g. `v3`)."}}}}}}}}}},"responses":{"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}}}},"paths":{"/v1/httpconnectors":{"get":{"operationId":"listHttpConnectors","tags":["HTTP Connectors"],"summary":"List HTTP connectors","description":"Returns all HTTP Connectors visible to the authenticated account.\nThe list response is abridged -- it omits `published`, `baseURIs`,\n`supportedBy`, and other detail fields. Use the by-ID endpoint for\nthe full object.","parameters":[{"name":"publishedOnly","in":"query","description":"When true, only return published HTTP Connectors.","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Successfully retrieved list of HTTP Connectors.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ListItem"}}}}},"204":{"description":"No HTTP Connectors match the filter criteria."},"401":{"$ref":"#/components/responses/401-unauthorized"}}}}}}
```

## Create an HTTP connector

> Creates a new HTTP Connector framework definition. \`name\` is\
> required, along with either \`versions\` (flat connector) or \`apis\`\
> (grouped connector).

````json
{"openapi":"3.2.0","info":{"title":"HTTP Connectors","version":"1.0.0"},"tags":[{"name":"HTTP Connectors","description":"HTTP Connectors define reusable API frameworks — base URIs, versioning\nstrategies, authentication presets, and supported-by rules — that\nHTTP connections, iClients, imports, and exports inherit.\n\nEach connector has one or more versions and may group multiple API\nproducts under `apis[]`. Child resources (HTTP Connector Resources\nand Endpoints) define the specific operations available.\n\nTwo structural patterns exist:\n- **Flat** — versions and baseURIs sit directly on the connector.\n  Most connectors use this pattern.\n- **Grouped** — the connector nests API products under `apis[]`,\n  each with its own versions and baseURIs.\n\n## HTTP connector schema\n\n{% openapi-schemas spec=\"httpconnector\" schemas=\"HTTPConnector\" grouped=\"true\" %}"}],"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"},{"url":"https://api.au.integrator.io","description":"Production (AU region)"},{"url":"https://api.ca.integrator.io","description":"Production (CA region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"Request":{"type":"object","description":"Fields for creating or updating an HTTP Connector. `name` is always\nrequired. On create, provide either `versions` (flat connector) or\n`apis` (grouped connector) -- most connectors use the flat pattern.","required":["name"],"allOf":[{"$ref":"#/components/schemas/HTTPConnectorBase"}]},"HTTPConnectorBase":{"type":"object","description":"Writable fields shared by the request and response schemas.","properties":{"name":{"type":"string","description":"Display name for this HTTP Connector.","maxLength":255},"published":{"type":"boolean","description":"When true, this connector is visible to users."},"baseURIs":{"type":"array","description":"Base URI templates (used when `apis` is empty).","items":{"type":"string"}},"helpURL":{"type":"string","description":"Documentation URL shown to users when configuring this connector."},"legacyId":{"type":"string","description":"Legacy assistant ID for backward compatibility."},"isGraphQL":{"type":"boolean","description":"When true, this connector targets a GraphQL API."},"requireBodyMatchForLinking":{"type":"boolean","description":"Require request body matching when auto-linking exports/imports."},"disableAutoLinking":{"type":"boolean","description":"Disable automatic linking of exports/imports to this connector."},"versioning":{"$ref":"#/components/schemas/Versioning"},"versions":{"type":"array","description":"Connector versions (used when `apis` is empty).","items":{"$ref":"#/components/schemas/Version"}},"apis":{"type":"array","description":"API groups under this connector. Each group has its own versions, baseURIs, and supportedBy config.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for this API group."},"name":{"type":"string","description":"Display name for this API group."},"description":{"type":"string","maxLength":10240,"description":"Explains what this API group covers, shown to users when selecting an API."},"published":{"type":"boolean","description":"When true, this API group is visible to users."},"baseURIs":{"type":"array","description":"Base URI templates used for requests targeting this API group.","items":{"type":"string"}},"helpURL":{"type":"string","description":"Documentation URL shown to users when configuring this API group."},"legacyId":{"type":"string","description":"Legacy assistant ID for backward compatibility."},"isGraphQL":{"type":"boolean","description":"When true, this API group targets a GraphQL API."},"versioning":{"$ref":"#/components/schemas/Versioning"},"versions":{"type":"array","description":"Versions available under this API group.","items":{"$ref":"#/components/schemas/Version"}},"supportedBy":{"$ref":"#/components/schemas/SupportedBy"},"setDefault":{"type":"boolean","description":"When true, this API group is the connector's default selection."}}}},"supportedBy":{"allOf":[{"$ref":"#/components/schemas/SupportedBy"}]},"preBuiltExports":{"type":"array","description":"Pre-built export templates associated with this connector.","items":{"type":"object","properties":{"_exportId":{"type":"string","format":"objectId","description":"Export resource that serves as the pre-built template."},"published":{"type":"boolean","description":"When true, this pre-built export is visible to users."}},"required":["_exportId"]}},"preBuiltImports":{"type":"array","description":"Pre-built import templates associated with this connector.","items":{"type":"object","properties":{"_importId":{"type":"string","format":"objectId","description":"Import resource that serves as the pre-built template."},"published":{"type":"boolean","description":"When true, this pre-built import is visible to users."}},"required":["_importId"]}}}},"Versioning":{"type":"object","description":"Strategy for how API versions are passed in requests. Used at the\nconnector level and per API group; both use the same shape.","properties":{"location":{"type":"string","enum":["uri","query_parameter","header"],"description":"Where the version identifier is placed in outgoing requests."},"headerName":{"type":"string","description":"Header name when `location` is `header`."},"queryParameterName":{"type":"string","description":"Query parameter name when `location` is `query_parameter`."}}},"Version":{"type":"object","description":"A version of the connector (or of an API group). Both contexts use the\nsame shape.","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for this version."},"name":{"type":"string","description":"Display name for this version (e.g. `v3`)."},"published":{"type":"boolean","description":"When true, this version is visible to users."},"baseURIs":{"type":"array","description":"Base URI templates used for requests targeting this version.","items":{"type":"string"}},"supportedBy":{"$ref":"#/components/schemas/SupportedBy"}}},"SupportedBy":{"type":"object","description":"Framework-defined defaults that pre-configure fields and prompt users\nwhen a connection, export, import, or iClient is created from this\nconnector (or from a specific version / API group).","properties":{"connection":{"$ref":"#/components/schemas/SupportedBySection"},"export":{"$ref":"#/components/schemas/SupportedBySection"},"import":{"$ref":"#/components/schemas/SupportedBySection"},"iClient":{"$ref":"#/components/schemas/SupportedBySection"}}},"SupportedBySection":{"type":"object","description":"Conditions, pre-configured field values, and fields the user must set\nfor one resource type (connection, export, import, or iClient) when it\nis created from this connector. All four sections share this shape.","properties":{"preConfiguredFields":{"type":"array","description":"Fields automatically set on the target resource. Not editable by the user.","items":{"$ref":"#/components/schemas/SupportedByPreConfiguredField"}},"fieldsUserMustSet":{"type":"array","description":"Fields the user must provide values for when creating the target resource.","items":{"$ref":"#/components/schemas/SupportedByFieldUserMustSet"}},"fieldsToUnset":{"type":"array","description":"Field paths to clear on the target resource."},"conditions":{"type":"array","description":"Expression-based filters referenced by `_conditionIds` in\n`preConfiguredFields` and `fieldsUserMustSet` to conditionally\napply those field configurations.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for this condition, referenced by `_conditionIds` in field entries."},"condition":{"$ref":"#/components/schemas/Filter"}}}}}},"SupportedByPreConfiguredField":{"type":"object","description":"A field automatically set to a predefined value on the target resource.","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for this field entry."},"path":{"type":"string","description":"Dot-notation path of the field on the target resource."},"values":{"type":"array","description":"Value(s) to assign. Typically a single-element array; entries may be\nany JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this field to apply. If absent, always applies.","items":{"type":"string","format":"objectId"}}}},"SupportedByFieldUserMustSet":{"type":"object","description":"A field the user must provide a value for when creating the target resource.","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for this field entry."},"path":{"type":"string","description":"Dot-notation path of the field on the target resource."},"values":{"type":"array","description":"Optional suggested or constrained values. Entries may be any JSON\ntype."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this field to apply.","items":{"type":"string","format":"objectId"}},"helpURL":{"type":"string","description":"URL to documentation for this field."},"labelOverride":{"type":"string","description":"Custom label to display in the UI instead of the default."},"inputType":{"type":"string","enum":["number","password","uri"],"description":"UI input widget type shown when prompting the user for this field.\nUses the same widget vocabulary as Trading Partner Connectors."}}},"Filter":{"type":"object","description":"Configuration for selectively processing records based on specified criteria. This object enables\nprecise control over which items are included or excluded from processing operations.\n\n**Filter behavior**\n\nWhen configured, the filter is applied before processing begins:\n- Items that match the filter criteria are processed\n- Items that don't match are completely skipped\n- No partial processing is performed\n\nSend the whole object. A rules array sent alone as the `filter` value is not\nstored, and a full update of an export that carries one removes the filter the\nexport had, with no error.\n\n**Implementation approaches**\n\nThere are two distinct filtering mechanisms available:\n\n**Rule-Based Filtering (`type: \"expression\"`)**\n- **Best For**: Common filtering patterns based on standard attributes\n- **Capabilities**: Filter by names, values, dates, numerical ranges, text patterns\n- **Advantages**: Declarative, no coding required, consistent performance\n- **Configuration**: Define rules in the `expression` object\n- **Use When**: You have clear, static criteria for selection\n\n**Script-Based Filtering (`type: \"script\"`)**\n- **Best For**: Complex logic, dynamic criteria, or business rules\n- **Capabilities**: Full programmatic control, access to complete metadata\n- **Advantages**: Maximum flexibility, can implement any filtering logic\n- **Configuration**: Reference a script in the `script` object\n- **Use When**: Simple rules aren't sufficient or logic needs to be dynamic\n","properties":{"type":{"type":"string","description":"Determines which filtering mechanism to use. This choice affects which properties\nmust be configured and how filtering logic is implemented.\n\n**Available types**\n\n**Rule-Based Filtering (`\"expression\"`)**\n- **Required Config**: The `expression` object with rule definitions\n- **Behavior**: Evaluates declarative rules against item attributes\n- **Best For**: Common patterns like name matching, date ranges, value limits\n- **Advantages**: Simpler to configure, no custom code required\n\n**Script-Based Filtering (`\"script\"`)**\n- **Required Config**: The `script` object with _scriptId and function\n- **Behavior**: Executes custom JavaScript to determine which items to process\n- **Best For**: Complex conditions, business logic, dynamic criteria\n- **Advantages**: Maximum flexibility, can implement any logic\n\n**Implementation guidance**\n\n1. For standard filtering needs (name, size, date), use `\"expression\"`\n2. For complex logic or conditions not covered by expressions, use `\"script\"`\n3. When selecting a type, you must configure the corresponding object:\n    - `type: \"expression\"` requires the `expression` object\n    - `type: \"script\"` requires the `script` object\n","enum":["expression","script"]},"expression":{"type":"object","description":"Configuration for declarative rule-based filtering. This object enables filtering\nitems based on common attributes without requiring custom code.\n\n**Usage context**\n\nThis object is REQUIRED when `filter.type` is set to \"expression\" and should not be\nconfigured otherwise. It provides a standardized way to define filtering rules that\ncan match against item attributes like name, type, value, date, and other properties.\n\n**Implementation guidance**\n\nThe expression system uses a rule-based approach where:\n- Rules can be combined with AND/OR logic\n- Each rule can check a specific attribute\n- Multiple conditions can be applied (ranges, pattern matching, exact matches)\n\n**Common filter patterns**\n\n1. **Pattern matching**: Regular expressions with `matches`\n2. **Value range filtering**: Numbers between min and max values\n3. **Date range filtering**: Items created/modified within specific time ranges\n4. **Status checking**: Items with specific status values or properties\n\nFor AI agents: Rule-based filtering should be your first choice when the filtering criteria\ncan be expressed in terms of standard attributes. Only use script-based filtering when\nmore complex logic is required.\n","properties":{"version":{"type":"string","description":"Version identifier for the expression format. Currently only version \"1\" is supported.\n\nThis field ensures future compatibility if the expression format evolves. Always set to \"1\"\nfor current implementations.\n","enum":["1"]},"rules":{"type":"array","description":"Expression array defining filter conditions using prefix notation. The first element is the operator,\nfollowed by its operands which may themselves be nested expression arrays.\n\nThe rule expression follows this pattern:\n- First element: Operator name (string)\n- Remaining elements: Operands for that operator (values or nested expressions)\n\n**Expression structure**\n\nFilter expressions use a prefix notation where operators appear before their operands:\n```\n[operator, operand1, operand2, ...]\n```\n\n**Comparison Operators**\n- `\"equals\"`: Exact match (equals)\n- `\"notequals\"`: Not equal to value (not equals)\n- `\"greaterthan\"`: Value is greater than specified value (is greater than)\n- `\"greaterthanequals\"`: Value is greater than or equal to specified value (is greater than or equals)\n- `\"lessthan\"`: Value is less than specified value (is less than)\n- `\"lessthanequals\"`: Value is less than or equal to specified value (is less than or equals)\n- `\"startswith\"`: String starts with specified prefix (starts with)\n- `\"notstartswith\"`: String does not start with specified prefix (does not start with)\n- `\"endswith\"`: String ends with specified suffix (ends with)\n- `\"notendswith\"`: String does not end with specified suffix (does not end with)\n- `\"contains\"`: String contains specified substring (contains)\n- `\"doesnotcontain\"`: String does not contain specified substring (does not contain)\n- `\"empty\"`: Field is missing or empty (is empty)\n- `\"notempty\"`: Field contains a value (is not empty)\n- `\"matches\"`: Matches a regular expression, ignoring case (matches)\n\nOperator names are case-insensitive: `NOTEMPTY` and `endsWith` work and are stored\nas sent. `isempty`, `isnotempty`, `anyof`, `notcontains`, `doesnotstartwith`,\n`doesnotendwith`, `notmatches`, `doesnotmatch` and `notequal` are not operators:\nthey are refused with 422 \"Invalid operation: <name>\", with the name in lowercase,\nboth when the filter is saved and by `POST /v1/processors/filter`. To negate a\ncondition, wrap it in `not`.\n\nThe string comparisons (`equals`, `contains`, `startswith`, `endswith` and their\nnegations) are case-sensitive; wrap the field in `lowercase` to compare without case.\n`matches` is not: every pattern is compiled with the flags `gi`, so `^paid$` also\nmatches `PAID` and `[a-z]` matches capital letters. An inline flag such as `(?i)`\nmakes the pattern invalid. The filter still saves, but in a run every record fails\nwith `FILTER_EVALUATION_FAILED` (\"Invalid regular expression: /(?i)…/gi: Invalid\ngroup\"), and `POST /v1/processors/filter` refuses the call with 422 (live-verified\n2026-10-22).\n\n**Logical Operators**\n- `\"and\"`: All conditions must be true\n- `\"or\"`: At least one condition must be true\n- `\"not\"`: Negates the condition\n\n**Field Access and Type Conversion**\n- `\"extract\"`: Access a field from the item by name\n- `\"settings\"`: Access a custom setting from the flow, flow step, or integration configuration\n- `\"boolean\"`: Convert value to Boolean type\n- `\"epochtime\"`: Convert value to Epoch Time (Unix timestamp)\n- `\"number\"`: Convert value to Number type\n- `\"string\"`: Convert value to String type\n\n**Field Access Details**\n\n**Using `extract` to access record fields:**\n- Retrieves values from the current record being processed\n- Can access nested properties using dot notation (e.g., `\"customer.email\"`)\n- Paths are relative to the record itself: `[\"extract\", \"record.status\"]`\n  matches nothing\n- In a record filter, must be wrapped in a type conversion (`string`, `number`,\n  `boolean` or `epochtime`): a bare `[\"extract\", ...]` operand is refused with 422\n  \"Field operation extract must be called by a Type Conversion Operation but was called\n  by <operator>\", both when an import's filter is saved and by\n  `POST /v1/processors/filter`\n\n**Using `settings` to access configuration values:**\n- Retrieves values from the integration's configuration settings\n- Supports different scopes with prefix notation:\n  - `flow.settingName`: Access flow-level settings\n  - `flowGrouping.settingName`: Access the flow group's settings\n  - `export.settingName`: Access the export's (or lookup's) own settings\n  - `import.settingName`: Access the import's own settings\n  - `integration.settingName`: Access integration-level settings\n  - `connection.settingName`, `iClient.settingName`: Access the step's\n    connection and iClient settings\n- A scope whose resource has no settings can be absent; a rule that reads\n  it matches nothing\n- Must be wrapped in a type conversion like `extract`: a bare\n  `[\"settings\", ...]` operand is refused with 422 \"Field operation settings\n  must be called by a Type Conversion Operation\"\n- Useful for dynamic filtering based on configuration\n\n**Field Transformations**\n- `\"lowercase\"`: Convert string to lowercase\n- `\"uppercase\"`: Convert string to uppercase\n- `\"ceiling\"`: Round number up to the nearest integer\n- `\"floor\"`: Round number down to the nearest integer\n- `\"abs\"`: Get absolute value of a number\n\n**Arithmetic** (number operands)\n- `\"add\"`, `\"subtract\"`, `\"multiply\"`, `\"divide\"`, `\"modulo\"`: for example\n  `[\"subtract\", [\"number\", [\"extract\", \"total\"]], [\"number\", [\"extract\", \"discount\"]]]`.\n  `mod` is not an operator (422 \"Invalid operation: mod.\").\n\n**Dates**\n- `epochtime` reads ISO 8601 strings and epoch-millisecond numbers. An empty\n  string, a string that isn't a date, or epoch milliseconds sent as a string\n  fail it with \"Invalid date. Cannot convert given string or number to date\n  time.\", followed by `; record=` and the record as JSON: in a run that record fails (`FILTER_EVALUATION_FAILED`, source\n  `output_filter` on an export), and `POST /v1/processors/filter` and an\n  export preview refuse the whole call with 422. `and` and `or` evaluate\n  every operand, so a `notempty` test beside it doesn't prevent the failure.\n  A missing or null field doesn't match.\n- `datetime`, `date` and `timestamp` are not type conversions: 422\n  \"Invalid operation: <name>.\"\n- `number` reads a missing or empty field as 0.\n\n**Handlebars operands**\n- An operand can also be a string holding exactly one Handlebars expression, such as\n  `\"{{record.status}}\"` or `\"{{lowercase record.code}}\"`, on either side of the\n  operator. It renders against the record (`record.<field>`; an unprefixed\n  `{{status}}` renders empty) before the comparison.\n- The rendered value is a string: wrap it in `[\"number\", ...]` to compare it with a\n  number, or the rule is refused with 422.\n- `epochtime` does not render Handlebars: `[\"epochtime\", \"{{timestamp}}\"]` is refused\n  with 422 \"invalid datetime format\".\n- A string with text around the expression, or with more than one expression, is\n  compared as a literal.\n- `[\"number\", \"{{timestamp \\\"x\\\"}}\"]` is the current time in epoch milliseconds,\n  so `[\"greaterthanequals\", [\"epochtime\", [\"extract\", \"created\"]], [\"subtract\",\n  [\"number\", \"{{timestamp \\\"x\\\"}}\"], 604800000]]` keeps records created in the\n  last 7 days.\n- An unknown helper fails the rule with 422 \"Failed to evaluate handlebars\n  expression\".\n\nChoose the type conversion that matches the comparison — `number` for numeric\ncomparisons, `epochtime` for dates, `string` for text. For example:\n\n```json\n[\n  \"equals\",\n  [\n    \"number\",  // Convert to number before comparison\n    [\n      \"extract\",\n      \"quantity\"\n    ]\n  ],\n  100\n]\n```\n\nExample with datetime conversion:\n```json\n[\n  \"greaterthan\",\n  [\n    \"epochtime\",  // Convert to Unix timestamp before comparison\n    [\n      \"extract\",\n      \"createdDate\"\n    ]\n  ],\n  1609459200000  // January 1, 2021 as Unix timestamp in milliseconds\n]\n```\n\nExample with transformations:\n```json\n[\n  \"and\",\n  [\n    \"matches\",\n    [\n      \"lowercase\",  // Convert to lowercase before matching\n      [\n        \"string\",\n        [\n          \"extract\",\n          \"categories\"\n        ]\n      ]\n    ],\n    \"netsuite\"\n  ],\n  [\n    \"notequals\",\n    [\n      \"string\",\n      [\n        \"extract\",\n        \"recurrence.pattern.type\"\n      ]\n    ],\n    \"\"\n  ]\n]\n```\n\nExample comparing a record field with a flow setting:\n```json\n[\n  \"equals\",\n  [\n    \"string\",\n    [\n      \"extract\",\n      \"trantype\"\n    ]\n  ],\n  [\n    \"string\",\n    [\n      \"settings\",\n      \"flow.trantype\"\n    ]\n  ]\n]\n```\n\n**Examples**\n\nExample 1: Status field is not equal to \"cancelled\"\n```json\n[\n  \"notequals\",\n  [\n    \"string\",\n    [\n      \"extract\",\n      \"status\"\n    ]\n  ],\n  \"cancelled\"\n]\n```\n\nExample 2: Filename starts with \"HC\"\n```json\n[\n  \"startswith\",\n  [\n    \"string\",\n    [\n      \"extract\",\n      \"filename\"\n    ]\n  ],\n  \"HC\"\n]\n```\n\nExample 3: Amount is greater than 100\n```json\n[\n  \"greaterthan\",\n  [\n    \"number\",\n    [\n      \"extract\",\n      \"amount\"\n    ]\n  ],\n  100\n]\n```\n\nExample 4: Order date is after January 1, 2023 (UTC). Compare dates as `epochtime`\nagainst epoch milliseconds: a `string` comparison of ISO timestamps orders values with\ndifferent UTC offsets wrongly.\n```json\n[\n  \"greaterthan\",\n  [\n    \"epochtime\",\n    [\n      \"extract\",\n      \"orderDate\"\n    ]\n  ],\n  1672531200000\n]\n```\n","items":{"oneOf":[{"title":"String","type":"string"},{"title":"Number","type":"number"},{"title":"Boolean","type":"boolean"},{"title":"Object","type":"object"},{"title":"Array","type":"array"},{"title":"Null","type":"null"}]}}}},"script":{"type":"object","description":"Configuration for programmable script-based filtering. This object enables complex, custom\nfiltering logic beyond what expression-based filtering can provide.\n\n**Usage context**\n\nThis object is REQUIRED when `filter.type` is set to \"script\" and should not be configured\notherwise. It provides a way to execute custom JavaScript code to determine which items\nshould be processed.\n\n**Implementation approach**\n\nScript-based filtering works by:\n1. Executing the specified function from the referenced script\n2. Passing item data to the function\n3. Using the function's return value (true/false) to determine inclusion\n\n**Common use cases**\n\nScript filtering is ideal for:\n- Complex business logic that can't be expressed as simple rules\n- Dynamic filtering criteria that change based on external factors\n- Content-based filtering that requires deep inspection\n- Advanced pattern matching beyond simple wildcards\n- Multi-stage filtering with intermediate logic\n\nFor AI agents: Only use script-based filtering when expression-based filtering is insufficient.\nScript filtering requires maintaining custom code, which adds complexity to the integration.\n","properties":{"_scriptId":{"type":"string","description":"Reference to the Script resource that contains the filtering logic. This must be a valid\nObjectId of a Script resource in this account: any other id fails the save with 422\n(\"Only a script owned by the user or a script shared by the Integration App can be used\nat filter.script._scriptId.\").\n\nThe referenced script must contain the function specified in the `function` field\nand must be written to handle filtering specifically. The script receives\nitem data as its input and must return a boolean value indicating whether\nto process the item (true) or skip it (false).\n\nFormat: 24-character hexadecimal string (MongoDB ObjectId)\n"},"function":{"type":"string","description":"Name of the function within the script to execute for filtering decisions. This function\nmust exist in the script referenced by _scriptId.\n\n**Function requirements**\n\nThe specified function must:\n- Accept item data as its first parameter\n- Return a boolean value (true to process the item, false to skip it)\n- Handle errors gracefully\n- Execute efficiently (as it may run for many items)\n\n**Function signature**\n\n```javascript\nfunction filterItems(itemData) {\n  // itemData contains properties of the item being evaluated\n  // Custom logic here\n  return true; // or false to skip the item\n}\n```\n\nFor AI agents: Ensure the function name exactly matches a function defined in the\nreferenced script, as mismatches will cause the filter to fail.\n"}}}}},"HTTPConnector":{"type":"object","required":["_id","_userId","name","createdAt","lastModified"],"description":"HTTP Connector object as returned by the detail (by-ID) endpoint.","allOf":[{"$ref":"#/components/schemas/HTTPConnectorBase"},{"$ref":"#/components/schemas/ResourceResponse"},{"type":"object","properties":{"_userId":{"type":"string","format":"objectId","description":"User who created this connector.","readOnly":true},"legacyIds":{"type":"array","description":"All legacy assistant IDs associated with this connector.","readOnly":true,"items":{"type":"string"}},"supportsIClient":{"type":"boolean","description":"When true, this connector supports shared iClient credentials.","readOnly":true},"supportsWebhook":{"type":"boolean","description":"When true, this connector supports webhook-based exports.","readOnly":true},"hasBlobEndpoints":{"type":"boolean","description":"When true, at least one endpoint under this connector handles binary/blob data.","readOnly":true},"metadataLoadStrategy":{"type":"string","enum":["staged"],"readOnly":true,"description":"Present only when the connector uses staged metadata loading. Omitted\nwhen the stored strategy is `full`."},"__numOfBlobEndpoints":{"type":"number","description":"Number of blob endpoints for this connector","readOnly":true},"httpConnectorResources":{"type":"array","readOnly":true,"description":"Only present on GET /v1/httpconnectors/{_id} with a non-empty\n`returnEverything`, and empty unless it is exactly `true`. The\nconnector's resources, sorted by `_id`: the same set\n`GET /v1/httpconnectors/{_httpConnectorId}/httpconnectorresources` lists.","items":{"$ref":"#/components/schemas/HTTPConnectorResource"}},"httpConnectorEndpoints":{"type":"array","readOnly":true,"description":"Only present on GET /v1/httpconnectors/{_id} with a non-empty\n`returnEverything`, and empty unless it is exactly `true`. The\nendpoints of the returned resources, grouped in resource order.","items":{"$ref":"#/components/schemas/HTTPConnectorEndpoint"}},"metadata":{"type":"object","readOnly":true,"description":"Connector metadata used by Data Intelligence tooling. Returned\nonly by the detail (by-ID) endpoint — list responses omit it.","properties":{"di":{"type":"object","description":"Data Intelligence attributes for this connector.","properties":{"isSourceOnboard":{"type":"boolean","description":"When true, the connector is onboarded as a Data Intelligence source."},"apiResolution":{"type":"object","description":"Which API group and version Data Intelligence resolves this\nconnector to. Present only on connectors with multiple API\ngroups or versions.","properties":{"api":{"type":"string","description":"Name of the resolved API group."},"version":{"type":"string","description":"Name of the resolved version."}}}}}}}}}]},"ResourceResponse":{"type":"object","description":"Response","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for the resource. Format is a 24-character hexadecimal string."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was created. Set automatically and cannot be modified."},"lastModified":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was last updated. Changes whenever any property is modified."},"deletedAt":{"type":["string","null"],"format":"date-time","readOnly":true,"description":"Timestamp when the resource was soft-deleted. When null or absent, the resource is active."}},"required":["_id"]},"HTTPConnectorResource":{"type":"object","required":["_id","_httpConnectorId","name","published","createdAt","lastModified"],"description":"HTTP Connector Resource as returned by `GET /v1/httpconnectorresources`,\n`GET /v1/httpconnectorresources/{_id}`, and the nested\n`GET /v1/httpconnectors/{_httpConnectorId}/{_id}` — all three return the\nsame object. Optional fields that were never set are absent.","allOf":[{"$ref":"#/components/schemas/HTTPConnectorResourceBase"},{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for the resource. Doubles as the\n`_httpConnectorResourceId` path parameter of the HTTP Connector\nEndpoints API."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was created."},"lastModified":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was last updated. Changes on every PUT."}}}]},"HTTPConnectorResourceBase":{"type":"object","description":"Writable fields shared by the request and response schemas.","properties":{"name":{"type":"string","description":"Human-readable name of the API resource this grouping represents (for example \"Account\", \"Contact\", \"Order\")."},"published":{"type":"boolean","default":false,"description":"When true, the resource is visible to users of the connector's\npublished catalog. Only resources whose owner may publish HTTP\nconnectors appear to other accounts."},"_httpConnectorId":{"type":"string","format":"objectId","description":"HTTP Connector this resource belongs to. Must be a connector owned by\nthe caller's account."},"_httpConnectorApiId":{"type":"string","format":"objectId","description":"API group (an entry of the connector's `apis[]`) this resource belongs\nto. Set only for grouped connectors; flat connectors scope resources by\n`_versionIds` instead."},"_versionIds":{"type":"array","description":"Connector (or API group) versions this resource is available in. Each\nid must be one of the connector's `versions[]._id` values.","items":{"type":"string","format":"objectId"}},"_parentResourceId":{"type":"string","format":"objectId","description":"Parent resource when this resource is nested under another one (for\nexample \"Order line\" under \"Order\"). Omit for top-level resources;\ncannot be combined with `isRoot: true`."},"isRoot":{"type":"boolean","default":false,"description":"When true, marks the resource as the root of a resource hierarchy.\nRejected together with `_parentResourceId`."},"metadata":{"type":"object","additionalProperties":true,"description":"Free-form metadata stored with the resource, for example Data Intelligence attributes."},"resourceFields":{"type":"array","description":"Field catalog of the records this resource returns, used by tooling to\ndescribe the API's payloads. Fields nest through their own\n`resourceFields`.","items":{"$ref":"#/components/schemas/ResourceField"}},"supportedBy":{"$ref":"#/components/schemas/ResourceSupportedBy"}}},"ResourceField":{"type":"object","description":"One field of the resource's records, optionally with nested child fields.","required":["id"],"properties":{"id":{"type":"string","description":"Field identifier as it appears in the record."},"label":{"type":"string","description":"Display label for the field."},"description":{"type":"string","description":"Help text describing the field."},"dataType":{"type":"string","description":"Data type label for the field, stored as given."},"metadata":{"type":"object","additionalProperties":true,"description":"Free-form metadata for the field."},"resourceFields":{"type":"array","description":"Child fields of an object or array field. Absent when the field is scalar.","items":{"type":"object","additionalProperties":true,"description":"Nested field with the same shape as its parent."}}}},"ResourceSupportedBy":{"type":"object","description":"Defaults the connector framework applies when a user builds an export or\nan import on one of this resource's endpoints. Each section\npre-configures fields, lists the fields the user must still fill in, and\nclears fields that do not apply.","properties":{"export":{"$ref":"#/components/schemas/ResourceSupportedBySection"},"import":{"allOf":[{"$ref":"#/components/schemas/ResourceSupportedBySection"},{"type":"object","properties":{"pathParameterToIdentifyExisting":{"type":"string","description":"Path parameter whose value identifies the existing record on\nan update or upsert import. Needed only when the endpoint has\nmore than one path parameter."},"lookupToIdentifyExisting":{"type":"object","description":"Lookup the import runs to find out whether a record already\nexists before deciding between create and update. Both\nfields go together — sending one without the other is\nrejected.","properties":{"_httpConnectorEndpointId":{"type":"string","format":"objectId","description":"HTTP Connector Endpoint that performs the lookup. Must be\nan existing endpoint."},"extract":{"type":"string","description":"Path in the lookup response to read the existing record's identifier from."}}}}}]}}},"ResourceSupportedBySection":{"type":"object","description":"Conditions, pre-configured field values, required user inputs, and\nfields to clear for one resource type (export or import) created from\nthis resource.","properties":{"conditions":{"type":"array","description":"Expression-based filters referenced by `_conditionIds` in\n`preConfiguredFields` and `fieldsUserMustSet` to apply those entries\nconditionally.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Identifier of this condition, referenced by `_conditionIds` in field entries."},"condition":{"$ref":"#/components/schemas/Filter"}}}},"preConfiguredFields":{"type":"array","description":"Fields set automatically on the generated export or import. Not editable by the user.","items":{"type":"object","properties":{"path":{"type":"string","description":"Dot-notation name of the setting in the connector's form. It is not always a literal\npath on the generated export or import: a form group such as `response` takes an\nobject value (`{resourcePath: \"customers\"}`) that sets the step's\n`http.response.resourcePath`."},"values":{"type":"array","description":"Value(s) to assign. Typically a single-element array; entries may be any JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this entry to apply. Always applies when absent.","items":{"type":"string","format":"objectId"}}}}},"fieldsUserMustSet":{"type":"array","description":"Fields the user must provide values for on the generated export or import.","items":{"type":"object","properties":{"path":{"type":"string","description":"Dot-notation name of the setting the connector's form asks for: a step field such as\n`ignoreExisting` or `type`, or `mapping.fields.generate.<field>`, a destination field\nthe import's mapping must produce."},"values":{"type":"array","description":"Optional suggested or constrained values. Entries may be any JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this entry to apply.","items":{"type":"string","format":"objectId"}},"helpURL":{"type":"string","description":"URL to documentation for this field."},"labelOverride":{"type":"string","description":"Custom label shown in the UI instead of the default."}}}},"fieldsToUnset":{"type":"array","description":"Dot-notation paths to clear on the generated export or import.","items":{"type":"string"}}}},"HTTPConnectorEndpoint":{"type":"object","required":["_id","name","method","relativeURI","published","isBlob","isMappingRequired","mergePostBodyToPagingPostBody","_httpConnectorResourceIds","createdAt","lastModified"],"description":"HTTP Connector Endpoint as returned by `GET /v1/httpconnectorendpoints`,\n`GET /v1/httpconnectorendpoints/{_id}`, and the nested\n`GET /v1/httpconnectors/{_httpConnectorId}/{_httpConnectorResourceId}/{_id}`\n— all three return the same object. Optional fields that were never set\nare absent.","allOf":[{"$ref":"#/components/schemas/HTTPConnectorEndpointBase"},{"$ref":"#/components/schemas/ResourceResponse"},{"type":"object","properties":{"metadata":{"type":"object","description":"Endpoint metadata used by Data Intelligence tooling. Absent when\nnever set; Data Intelligence attributes can only be stored on a\npublished endpoint.","properties":{"di":{"type":"object","description":"Data Intelligence attributes for this endpoint.","properties":{"isListEndpoint":{"type":"boolean","description":"When true, the endpoint returns a list of records rather than a single record."},"responseFields":{"type":"array","description":"Fields Data Intelligence expects in this endpoint's response records.","items":{"type":"object","properties":{"id":{"type":"string","description":"Field path within a response record."},"dataType":{"type":"string","description":"Data type of the field."}}}}}}}}}}]},"HTTPConnectorEndpointBase":{"type":"object","description":"Writable fields shared by the request and response schemas.","properties":{"name":{"type":"string","description":"Human-readable name for this endpoint, shown when users pick an operation.","maxLength":255},"description":{"type":"string","description":"Help text describing what the endpoint does. Absent when never set.","maxLength":10240},"published":{"type":"boolean","default":false,"description":"When true, this endpoint is visible in the connector's published\ncatalog. Kept as stored when omitted on PUT."},"isBlob":{"type":"boolean","default":false,"description":"When true, this endpoint transfers binary (blob) content instead of records. Kept as stored when omitted on PUT."},"isMappingRequired":{"type":"boolean","default":false,"description":"When true, users must configure field mappings before an import built on this endpoint can run."},"_httpConnectorResourceIds":{"type":"array","minItems":1,"description":"HTTP Connector Resources this endpoint is listed under. Each id must\nbe a resource owned by the caller's account; the endpoint appears in\nthe nested listing of every resource named here.","items":{"type":"string","format":"objectId"}},"method":{"type":"string","enum":["GET","PUT","POST","PATCH","DELETE","HEAD"],"description":"HTTP method for this endpoint. Required on save; lowercase input is\nuppercased automatically."},"relativeURI":{"type":"string","description":"Relative URI template for this endpoint"},"mergePostBodyToPagingPostBody":{"type":"boolean","description":"When true, merges the postBody into pagingPostBody for paginated requests.","default":false},"queryParameters":{"type":"array","description":"Query parameter definitions","items":{"type":"object","properties":{"name":{"type":"string","description":"Parameter name as it appears in the request query string."},"label":{"type":"string","description":"Label shown to users in the UI for this parameter. Defaults to `name` when omitted."},"description":{"type":"string","description":"Help text shown to users explaining what this parameter does."},"required":{"type":"boolean","description":"When true, the user must supply a value for this parameter."},"dataType":{"type":"string","enum":["input","date","select","multiselect","array","number"],"default":"input","description":"UI input type used to collect the parameter value. A free-form text input when omitted."},"values":{"type":"array","description":"Predefined values offered when `dataType` is `select` or `multiselect`.","items":{"type":"string"}}},"required":["name"]}},"pathParameters":{"type":"array","description":"Path parameter definitions","items":{"type":"object","properties":{"name":{"type":"string","description":"Parameter name as it appears in the `relativeURI` template."},"label":{"type":"string","description":"Label shown to users in the UI for this parameter. Defaults to `name` when omitted."},"description":{"type":"string","description":"Help text shown to users explaining what this parameter does."},"required":{"type":"boolean","description":"When true, the user must supply a value for this parameter."},"dataType":{"type":"string","enum":["input","date","select","multiselect","array","number"],"default":"input","description":"UI input type used to collect the parameter value. A free-form text input when omitted."},"values":{"type":"array","description":"Predefined values offered when `dataType` is `select` or `multiselect`.","items":{"type":"string"}}},"required":["name"]}},"resourceFields":{"type":"array","description":"Resource field definitions for this endpoint","items":{"type":"object","properties":{"type":{"type":"string","enum":["inclusion","exclusion"],"description":"Whether `fields` lists the fields to include or to exclude."},"fields":{"type":"array","description":"Field names the inclusion or exclusion rule applies to.","items":{"type":"string"}},"_httpConnectorResourceId":{"type":"string","format":"objectId","description":"HTTP Connector Resource these field rules apply to."}},"required":["type","fields","_httpConnectorResourceId"]}},"supportedBy":{"type":"object","description":"How the connector framework turns this endpoint into an export or an\nimport: which one it becomes, the fields it pre-configures, and the\nfields the user must still fill in. Each entry's `path` names a setting\nin the connector's form, which is not always a literal path on the\ngenerated export or import.","required":["type"],"properties":{"type":{"type":"string","enum":["import","export"],"description":"Whether this endpoint is consumed as an import or an export. Also\nthe value the nested listing's `supportedByType` filter matches."},"conditions":{"type":"array","description":"Expression-based filters that control when entries in `preConfiguredFields` and `fieldsUserMustSet` apply.","items":{"type":"object","additionalProperties":true}},"preConfiguredFields":{"type":"array","description":"Fields automatically set to predefined values on the generated export or import. Not editable by the user.","items":{"type":"object","additionalProperties":true}},"fieldsUserMustSet":{"type":"array","description":"Fields the user must provide values for on the generated export or import.","items":{"type":"object","additionalProperties":true}},"fieldsToUnset":{"type":"array","description":"Dot-notation paths of fields to remove from the generated export or import configuration.","items":{"type":"string"}},"pathParameterToIdentifyExisting":{"type":"string","description":"Path parameter whose value identifies an existing record in the target application."},"lookupToIdentifyExisting":{"type":"object","description":"Lookup used to determine whether a record already exists in the target application.","properties":{"_httpConnectorEndpointId":{"type":"string","format":"objectId","description":"HTTP Connector Endpoint used to perform the lookup."},"extract":{"type":"string","description":"Path in the lookup response from which to extract the existing record's identifier."}}}}}}},"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}},"responses":{"400-bad-request":{"description":"Bad request. The server could not understand the request because of malformed syntax or invalid parameters.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}},"403-forbidden":{"description":"Forbidden. The authenticated caller does not have permission to perform this operation.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422-unprocessable-entity":{"description":"Unprocessable entity. The request was well-formed but was unable to be followed due to semantic errors.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/v1/httpconnectors":{"post":{"operationId":"createHttpConnector","tags":["HTTP Connectors"],"summary":"Create an HTTP connector","description":"Creates a new HTTP Connector framework definition. `name` is\nrequired, along with either `versions` (flat connector) or `apis`\n(grouped connector).","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Request"}}}},"responses":{"201":{"description":"HTTP Connector created successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPConnector"}}}},"400":{"$ref":"#/components/responses/400-bad-request"},"401":{"$ref":"#/components/responses/401-unauthorized"},"403":{"$ref":"#/components/responses/403-forbidden"},"422":{"$ref":"#/components/responses/422-unprocessable-entity"}}}}}}
````

## Get an HTTP connector

> Retrieves the full HTTP Connector object including \`published\`,\
> \`baseURIs\`, \`supportedBy\`, and version details omitted from the\
> list endpoint.

````json
{"openapi":"3.2.0","info":{"title":"HTTP Connectors","version":"1.0.0"},"tags":[{"name":"HTTP Connectors","description":"HTTP Connectors define reusable API frameworks — base URIs, versioning\nstrategies, authentication presets, and supported-by rules — that\nHTTP connections, iClients, imports, and exports inherit.\n\nEach connector has one or more versions and may group multiple API\nproducts under `apis[]`. Child resources (HTTP Connector Resources\nand Endpoints) define the specific operations available.\n\nTwo structural patterns exist:\n- **Flat** — versions and baseURIs sit directly on the connector.\n  Most connectors use this pattern.\n- **Grouped** — the connector nests API products under `apis[]`,\n  each with its own versions and baseURIs.\n\n## HTTP connector schema\n\n{% openapi-schemas spec=\"httpconnector\" schemas=\"HTTPConnector\" grouped=\"true\" %}"}],"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"},{"url":"https://api.au.integrator.io","description":"Production (AU region)"},{"url":"https://api.ca.integrator.io","description":"Production (CA region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"HTTPConnector":{"type":"object","required":["_id","_userId","name","createdAt","lastModified"],"description":"HTTP Connector object as returned by the detail (by-ID) endpoint.","allOf":[{"$ref":"#/components/schemas/HTTPConnectorBase"},{"$ref":"#/components/schemas/ResourceResponse"},{"type":"object","properties":{"_userId":{"type":"string","format":"objectId","description":"User who created this connector.","readOnly":true},"legacyIds":{"type":"array","description":"All legacy assistant IDs associated with this connector.","readOnly":true,"items":{"type":"string"}},"supportsIClient":{"type":"boolean","description":"When true, this connector supports shared iClient credentials.","readOnly":true},"supportsWebhook":{"type":"boolean","description":"When true, this connector supports webhook-based exports.","readOnly":true},"hasBlobEndpoints":{"type":"boolean","description":"When true, at least one endpoint under this connector handles binary/blob data.","readOnly":true},"metadataLoadStrategy":{"type":"string","enum":["staged"],"readOnly":true,"description":"Present only when the connector uses staged metadata loading. Omitted\nwhen the stored strategy is `full`."},"__numOfBlobEndpoints":{"type":"number","description":"Number of blob endpoints for this connector","readOnly":true},"httpConnectorResources":{"type":"array","readOnly":true,"description":"Only present on GET /v1/httpconnectors/{_id} with a non-empty\n`returnEverything`, and empty unless it is exactly `true`. The\nconnector's resources, sorted by `_id`: the same set\n`GET /v1/httpconnectors/{_httpConnectorId}/httpconnectorresources` lists.","items":{"$ref":"#/components/schemas/HTTPConnectorResource"}},"httpConnectorEndpoints":{"type":"array","readOnly":true,"description":"Only present on GET /v1/httpconnectors/{_id} with a non-empty\n`returnEverything`, and empty unless it is exactly `true`. The\nendpoints of the returned resources, grouped in resource order.","items":{"$ref":"#/components/schemas/HTTPConnectorEndpoint"}},"metadata":{"type":"object","readOnly":true,"description":"Connector metadata used by Data Intelligence tooling. Returned\nonly by the detail (by-ID) endpoint — list responses omit it.","properties":{"di":{"type":"object","description":"Data Intelligence attributes for this connector.","properties":{"isSourceOnboard":{"type":"boolean","description":"When true, the connector is onboarded as a Data Intelligence source."},"apiResolution":{"type":"object","description":"Which API group and version Data Intelligence resolves this\nconnector to. Present only on connectors with multiple API\ngroups or versions.","properties":{"api":{"type":"string","description":"Name of the resolved API group."},"version":{"type":"string","description":"Name of the resolved version."}}}}}}}}}]},"HTTPConnectorBase":{"type":"object","description":"Writable fields shared by the request and response schemas.","properties":{"name":{"type":"string","description":"Display name for this HTTP Connector.","maxLength":255},"published":{"type":"boolean","description":"When true, this connector is visible to users."},"baseURIs":{"type":"array","description":"Base URI templates (used when `apis` is empty).","items":{"type":"string"}},"helpURL":{"type":"string","description":"Documentation URL shown to users when configuring this connector."},"legacyId":{"type":"string","description":"Legacy assistant ID for backward compatibility."},"isGraphQL":{"type":"boolean","description":"When true, this connector targets a GraphQL API."},"requireBodyMatchForLinking":{"type":"boolean","description":"Require request body matching when auto-linking exports/imports."},"disableAutoLinking":{"type":"boolean","description":"Disable automatic linking of exports/imports to this connector."},"versioning":{"$ref":"#/components/schemas/Versioning"},"versions":{"type":"array","description":"Connector versions (used when `apis` is empty).","items":{"$ref":"#/components/schemas/Version"}},"apis":{"type":"array","description":"API groups under this connector. Each group has its own versions, baseURIs, and supportedBy config.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for this API group."},"name":{"type":"string","description":"Display name for this API group."},"description":{"type":"string","maxLength":10240,"description":"Explains what this API group covers, shown to users when selecting an API."},"published":{"type":"boolean","description":"When true, this API group is visible to users."},"baseURIs":{"type":"array","description":"Base URI templates used for requests targeting this API group.","items":{"type":"string"}},"helpURL":{"type":"string","description":"Documentation URL shown to users when configuring this API group."},"legacyId":{"type":"string","description":"Legacy assistant ID for backward compatibility."},"isGraphQL":{"type":"boolean","description":"When true, this API group targets a GraphQL API."},"versioning":{"$ref":"#/components/schemas/Versioning"},"versions":{"type":"array","description":"Versions available under this API group.","items":{"$ref":"#/components/schemas/Version"}},"supportedBy":{"$ref":"#/components/schemas/SupportedBy"},"setDefault":{"type":"boolean","description":"When true, this API group is the connector's default selection."}}}},"supportedBy":{"allOf":[{"$ref":"#/components/schemas/SupportedBy"}]},"preBuiltExports":{"type":"array","description":"Pre-built export templates associated with this connector.","items":{"type":"object","properties":{"_exportId":{"type":"string","format":"objectId","description":"Export resource that serves as the pre-built template."},"published":{"type":"boolean","description":"When true, this pre-built export is visible to users."}},"required":["_exportId"]}},"preBuiltImports":{"type":"array","description":"Pre-built import templates associated with this connector.","items":{"type":"object","properties":{"_importId":{"type":"string","format":"objectId","description":"Import resource that serves as the pre-built template."},"published":{"type":"boolean","description":"When true, this pre-built import is visible to users."}},"required":["_importId"]}}}},"Versioning":{"type":"object","description":"Strategy for how API versions are passed in requests. Used at the\nconnector level and per API group; both use the same shape.","properties":{"location":{"type":"string","enum":["uri","query_parameter","header"],"description":"Where the version identifier is placed in outgoing requests."},"headerName":{"type":"string","description":"Header name when `location` is `header`."},"queryParameterName":{"type":"string","description":"Query parameter name when `location` is `query_parameter`."}}},"Version":{"type":"object","description":"A version of the connector (or of an API group). Both contexts use the\nsame shape.","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for this version."},"name":{"type":"string","description":"Display name for this version (e.g. `v3`)."},"published":{"type":"boolean","description":"When true, this version is visible to users."},"baseURIs":{"type":"array","description":"Base URI templates used for requests targeting this version.","items":{"type":"string"}},"supportedBy":{"$ref":"#/components/schemas/SupportedBy"}}},"SupportedBy":{"type":"object","description":"Framework-defined defaults that pre-configure fields and prompt users\nwhen a connection, export, import, or iClient is created from this\nconnector (or from a specific version / API group).","properties":{"connection":{"$ref":"#/components/schemas/SupportedBySection"},"export":{"$ref":"#/components/schemas/SupportedBySection"},"import":{"$ref":"#/components/schemas/SupportedBySection"},"iClient":{"$ref":"#/components/schemas/SupportedBySection"}}},"SupportedBySection":{"type":"object","description":"Conditions, pre-configured field values, and fields the user must set\nfor one resource type (connection, export, import, or iClient) when it\nis created from this connector. All four sections share this shape.","properties":{"preConfiguredFields":{"type":"array","description":"Fields automatically set on the target resource. Not editable by the user.","items":{"$ref":"#/components/schemas/SupportedByPreConfiguredField"}},"fieldsUserMustSet":{"type":"array","description":"Fields the user must provide values for when creating the target resource.","items":{"$ref":"#/components/schemas/SupportedByFieldUserMustSet"}},"fieldsToUnset":{"type":"array","description":"Field paths to clear on the target resource."},"conditions":{"type":"array","description":"Expression-based filters referenced by `_conditionIds` in\n`preConfiguredFields` and `fieldsUserMustSet` to conditionally\napply those field configurations.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for this condition, referenced by `_conditionIds` in field entries."},"condition":{"$ref":"#/components/schemas/Filter"}}}}}},"SupportedByPreConfiguredField":{"type":"object","description":"A field automatically set to a predefined value on the target resource.","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for this field entry."},"path":{"type":"string","description":"Dot-notation path of the field on the target resource."},"values":{"type":"array","description":"Value(s) to assign. Typically a single-element array; entries may be\nany JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this field to apply. If absent, always applies.","items":{"type":"string","format":"objectId"}}}},"SupportedByFieldUserMustSet":{"type":"object","description":"A field the user must provide a value for when creating the target resource.","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for this field entry."},"path":{"type":"string","description":"Dot-notation path of the field on the target resource."},"values":{"type":"array","description":"Optional suggested or constrained values. Entries may be any JSON\ntype."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this field to apply.","items":{"type":"string","format":"objectId"}},"helpURL":{"type":"string","description":"URL to documentation for this field."},"labelOverride":{"type":"string","description":"Custom label to display in the UI instead of the default."},"inputType":{"type":"string","enum":["number","password","uri"],"description":"UI input widget type shown when prompting the user for this field.\nUses the same widget vocabulary as Trading Partner Connectors."}}},"Filter":{"type":"object","description":"Configuration for selectively processing records based on specified criteria. This object enables\nprecise control over which items are included or excluded from processing operations.\n\n**Filter behavior**\n\nWhen configured, the filter is applied before processing begins:\n- Items that match the filter criteria are processed\n- Items that don't match are completely skipped\n- No partial processing is performed\n\nSend the whole object. A rules array sent alone as the `filter` value is not\nstored, and a full update of an export that carries one removes the filter the\nexport had, with no error.\n\n**Implementation approaches**\n\nThere are two distinct filtering mechanisms available:\n\n**Rule-Based Filtering (`type: \"expression\"`)**\n- **Best For**: Common filtering patterns based on standard attributes\n- **Capabilities**: Filter by names, values, dates, numerical ranges, text patterns\n- **Advantages**: Declarative, no coding required, consistent performance\n- **Configuration**: Define rules in the `expression` object\n- **Use When**: You have clear, static criteria for selection\n\n**Script-Based Filtering (`type: \"script\"`)**\n- **Best For**: Complex logic, dynamic criteria, or business rules\n- **Capabilities**: Full programmatic control, access to complete metadata\n- **Advantages**: Maximum flexibility, can implement any filtering logic\n- **Configuration**: Reference a script in the `script` object\n- **Use When**: Simple rules aren't sufficient or logic needs to be dynamic\n","properties":{"type":{"type":"string","description":"Determines which filtering mechanism to use. This choice affects which properties\nmust be configured and how filtering logic is implemented.\n\n**Available types**\n\n**Rule-Based Filtering (`\"expression\"`)**\n- **Required Config**: The `expression` object with rule definitions\n- **Behavior**: Evaluates declarative rules against item attributes\n- **Best For**: Common patterns like name matching, date ranges, value limits\n- **Advantages**: Simpler to configure, no custom code required\n\n**Script-Based Filtering (`\"script\"`)**\n- **Required Config**: The `script` object with _scriptId and function\n- **Behavior**: Executes custom JavaScript to determine which items to process\n- **Best For**: Complex conditions, business logic, dynamic criteria\n- **Advantages**: Maximum flexibility, can implement any logic\n\n**Implementation guidance**\n\n1. For standard filtering needs (name, size, date), use `\"expression\"`\n2. For complex logic or conditions not covered by expressions, use `\"script\"`\n3. When selecting a type, you must configure the corresponding object:\n    - `type: \"expression\"` requires the `expression` object\n    - `type: \"script\"` requires the `script` object\n","enum":["expression","script"]},"expression":{"type":"object","description":"Configuration for declarative rule-based filtering. This object enables filtering\nitems based on common attributes without requiring custom code.\n\n**Usage context**\n\nThis object is REQUIRED when `filter.type` is set to \"expression\" and should not be\nconfigured otherwise. It provides a standardized way to define filtering rules that\ncan match against item attributes like name, type, value, date, and other properties.\n\n**Implementation guidance**\n\nThe expression system uses a rule-based approach where:\n- Rules can be combined with AND/OR logic\n- Each rule can check a specific attribute\n- Multiple conditions can be applied (ranges, pattern matching, exact matches)\n\n**Common filter patterns**\n\n1. **Pattern matching**: Regular expressions with `matches`\n2. **Value range filtering**: Numbers between min and max values\n3. **Date range filtering**: Items created/modified within specific time ranges\n4. **Status checking**: Items with specific status values or properties\n\nFor AI agents: Rule-based filtering should be your first choice when the filtering criteria\ncan be expressed in terms of standard attributes. Only use script-based filtering when\nmore complex logic is required.\n","properties":{"version":{"type":"string","description":"Version identifier for the expression format. Currently only version \"1\" is supported.\n\nThis field ensures future compatibility if the expression format evolves. Always set to \"1\"\nfor current implementations.\n","enum":["1"]},"rules":{"type":"array","description":"Expression array defining filter conditions using prefix notation. The first element is the operator,\nfollowed by its operands which may themselves be nested expression arrays.\n\nThe rule expression follows this pattern:\n- First element: Operator name (string)\n- Remaining elements: Operands for that operator (values or nested expressions)\n\n**Expression structure**\n\nFilter expressions use a prefix notation where operators appear before their operands:\n```\n[operator, operand1, operand2, ...]\n```\n\n**Comparison Operators**\n- `\"equals\"`: Exact match (equals)\n- `\"notequals\"`: Not equal to value (not equals)\n- `\"greaterthan\"`: Value is greater than specified value (is greater than)\n- `\"greaterthanequals\"`: Value is greater than or equal to specified value (is greater than or equals)\n- `\"lessthan\"`: Value is less than specified value (is less than)\n- `\"lessthanequals\"`: Value is less than or equal to specified value (is less than or equals)\n- `\"startswith\"`: String starts with specified prefix (starts with)\n- `\"notstartswith\"`: String does not start with specified prefix (does not start with)\n- `\"endswith\"`: String ends with specified suffix (ends with)\n- `\"notendswith\"`: String does not end with specified suffix (does not end with)\n- `\"contains\"`: String contains specified substring (contains)\n- `\"doesnotcontain\"`: String does not contain specified substring (does not contain)\n- `\"empty\"`: Field is missing or empty (is empty)\n- `\"notempty\"`: Field contains a value (is not empty)\n- `\"matches\"`: Matches a regular expression, ignoring case (matches)\n\nOperator names are case-insensitive: `NOTEMPTY` and `endsWith` work and are stored\nas sent. `isempty`, `isnotempty`, `anyof`, `notcontains`, `doesnotstartwith`,\n`doesnotendwith`, `notmatches`, `doesnotmatch` and `notequal` are not operators:\nthey are refused with 422 \"Invalid operation: <name>\", with the name in lowercase,\nboth when the filter is saved and by `POST /v1/processors/filter`. To negate a\ncondition, wrap it in `not`.\n\nThe string comparisons (`equals`, `contains`, `startswith`, `endswith` and their\nnegations) are case-sensitive; wrap the field in `lowercase` to compare without case.\n`matches` is not: every pattern is compiled with the flags `gi`, so `^paid$` also\nmatches `PAID` and `[a-z]` matches capital letters. An inline flag such as `(?i)`\nmakes the pattern invalid. The filter still saves, but in a run every record fails\nwith `FILTER_EVALUATION_FAILED` (\"Invalid regular expression: /(?i)…/gi: Invalid\ngroup\"), and `POST /v1/processors/filter` refuses the call with 422 (live-verified\n2026-10-22).\n\n**Logical Operators**\n- `\"and\"`: All conditions must be true\n- `\"or\"`: At least one condition must be true\n- `\"not\"`: Negates the condition\n\n**Field Access and Type Conversion**\n- `\"extract\"`: Access a field from the item by name\n- `\"settings\"`: Access a custom setting from the flow, flow step, or integration configuration\n- `\"boolean\"`: Convert value to Boolean type\n- `\"epochtime\"`: Convert value to Epoch Time (Unix timestamp)\n- `\"number\"`: Convert value to Number type\n- `\"string\"`: Convert value to String type\n\n**Field Access Details**\n\n**Using `extract` to access record fields:**\n- Retrieves values from the current record being processed\n- Can access nested properties using dot notation (e.g., `\"customer.email\"`)\n- Paths are relative to the record itself: `[\"extract\", \"record.status\"]`\n  matches nothing\n- In a record filter, must be wrapped in a type conversion (`string`, `number`,\n  `boolean` or `epochtime`): a bare `[\"extract\", ...]` operand is refused with 422\n  \"Field operation extract must be called by a Type Conversion Operation but was called\n  by <operator>\", both when an import's filter is saved and by\n  `POST /v1/processors/filter`\n\n**Using `settings` to access configuration values:**\n- Retrieves values from the integration's configuration settings\n- Supports different scopes with prefix notation:\n  - `flow.settingName`: Access flow-level settings\n  - `flowGrouping.settingName`: Access the flow group's settings\n  - `export.settingName`: Access the export's (or lookup's) own settings\n  - `import.settingName`: Access the import's own settings\n  - `integration.settingName`: Access integration-level settings\n  - `connection.settingName`, `iClient.settingName`: Access the step's\n    connection and iClient settings\n- A scope whose resource has no settings can be absent; a rule that reads\n  it matches nothing\n- Must be wrapped in a type conversion like `extract`: a bare\n  `[\"settings\", ...]` operand is refused with 422 \"Field operation settings\n  must be called by a Type Conversion Operation\"\n- Useful for dynamic filtering based on configuration\n\n**Field Transformations**\n- `\"lowercase\"`: Convert string to lowercase\n- `\"uppercase\"`: Convert string to uppercase\n- `\"ceiling\"`: Round number up to the nearest integer\n- `\"floor\"`: Round number down to the nearest integer\n- `\"abs\"`: Get absolute value of a number\n\n**Arithmetic** (number operands)\n- `\"add\"`, `\"subtract\"`, `\"multiply\"`, `\"divide\"`, `\"modulo\"`: for example\n  `[\"subtract\", [\"number\", [\"extract\", \"total\"]], [\"number\", [\"extract\", \"discount\"]]]`.\n  `mod` is not an operator (422 \"Invalid operation: mod.\").\n\n**Dates**\n- `epochtime` reads ISO 8601 strings and epoch-millisecond numbers. An empty\n  string, a string that isn't a date, or epoch milliseconds sent as a string\n  fail it with \"Invalid date. Cannot convert given string or number to date\n  time.\", followed by `; record=` and the record as JSON: in a run that record fails (`FILTER_EVALUATION_FAILED`, source\n  `output_filter` on an export), and `POST /v1/processors/filter` and an\n  export preview refuse the whole call with 422. `and` and `or` evaluate\n  every operand, so a `notempty` test beside it doesn't prevent the failure.\n  A missing or null field doesn't match.\n- `datetime`, `date` and `timestamp` are not type conversions: 422\n  \"Invalid operation: <name>.\"\n- `number` reads a missing or empty field as 0.\n\n**Handlebars operands**\n- An operand can also be a string holding exactly one Handlebars expression, such as\n  `\"{{record.status}}\"` or `\"{{lowercase record.code}}\"`, on either side of the\n  operator. It renders against the record (`record.<field>`; an unprefixed\n  `{{status}}` renders empty) before the comparison.\n- The rendered value is a string: wrap it in `[\"number\", ...]` to compare it with a\n  number, or the rule is refused with 422.\n- `epochtime` does not render Handlebars: `[\"epochtime\", \"{{timestamp}}\"]` is refused\n  with 422 \"invalid datetime format\".\n- A string with text around the expression, or with more than one expression, is\n  compared as a literal.\n- `[\"number\", \"{{timestamp \\\"x\\\"}}\"]` is the current time in epoch milliseconds,\n  so `[\"greaterthanequals\", [\"epochtime\", [\"extract\", \"created\"]], [\"subtract\",\n  [\"number\", \"{{timestamp \\\"x\\\"}}\"], 604800000]]` keeps records created in the\n  last 7 days.\n- An unknown helper fails the rule with 422 \"Failed to evaluate handlebars\n  expression\".\n\nChoose the type conversion that matches the comparison — `number` for numeric\ncomparisons, `epochtime` for dates, `string` for text. For example:\n\n```json\n[\n  \"equals\",\n  [\n    \"number\",  // Convert to number before comparison\n    [\n      \"extract\",\n      \"quantity\"\n    ]\n  ],\n  100\n]\n```\n\nExample with datetime conversion:\n```json\n[\n  \"greaterthan\",\n  [\n    \"epochtime\",  // Convert to Unix timestamp before comparison\n    [\n      \"extract\",\n      \"createdDate\"\n    ]\n  ],\n  1609459200000  // January 1, 2021 as Unix timestamp in milliseconds\n]\n```\n\nExample with transformations:\n```json\n[\n  \"and\",\n  [\n    \"matches\",\n    [\n      \"lowercase\",  // Convert to lowercase before matching\n      [\n        \"string\",\n        [\n          \"extract\",\n          \"categories\"\n        ]\n      ]\n    ],\n    \"netsuite\"\n  ],\n  [\n    \"notequals\",\n    [\n      \"string\",\n      [\n        \"extract\",\n        \"recurrence.pattern.type\"\n      ]\n    ],\n    \"\"\n  ]\n]\n```\n\nExample comparing a record field with a flow setting:\n```json\n[\n  \"equals\",\n  [\n    \"string\",\n    [\n      \"extract\",\n      \"trantype\"\n    ]\n  ],\n  [\n    \"string\",\n    [\n      \"settings\",\n      \"flow.trantype\"\n    ]\n  ]\n]\n```\n\n**Examples**\n\nExample 1: Status field is not equal to \"cancelled\"\n```json\n[\n  \"notequals\",\n  [\n    \"string\",\n    [\n      \"extract\",\n      \"status\"\n    ]\n  ],\n  \"cancelled\"\n]\n```\n\nExample 2: Filename starts with \"HC\"\n```json\n[\n  \"startswith\",\n  [\n    \"string\",\n    [\n      \"extract\",\n      \"filename\"\n    ]\n  ],\n  \"HC\"\n]\n```\n\nExample 3: Amount is greater than 100\n```json\n[\n  \"greaterthan\",\n  [\n    \"number\",\n    [\n      \"extract\",\n      \"amount\"\n    ]\n  ],\n  100\n]\n```\n\nExample 4: Order date is after January 1, 2023 (UTC). Compare dates as `epochtime`\nagainst epoch milliseconds: a `string` comparison of ISO timestamps orders values with\ndifferent UTC offsets wrongly.\n```json\n[\n  \"greaterthan\",\n  [\n    \"epochtime\",\n    [\n      \"extract\",\n      \"orderDate\"\n    ]\n  ],\n  1672531200000\n]\n```\n","items":{"oneOf":[{"title":"String","type":"string"},{"title":"Number","type":"number"},{"title":"Boolean","type":"boolean"},{"title":"Object","type":"object"},{"title":"Array","type":"array"},{"title":"Null","type":"null"}]}}}},"script":{"type":"object","description":"Configuration for programmable script-based filtering. This object enables complex, custom\nfiltering logic beyond what expression-based filtering can provide.\n\n**Usage context**\n\nThis object is REQUIRED when `filter.type` is set to \"script\" and should not be configured\notherwise. It provides a way to execute custom JavaScript code to determine which items\nshould be processed.\n\n**Implementation approach**\n\nScript-based filtering works by:\n1. Executing the specified function from the referenced script\n2. Passing item data to the function\n3. Using the function's return value (true/false) to determine inclusion\n\n**Common use cases**\n\nScript filtering is ideal for:\n- Complex business logic that can't be expressed as simple rules\n- Dynamic filtering criteria that change based on external factors\n- Content-based filtering that requires deep inspection\n- Advanced pattern matching beyond simple wildcards\n- Multi-stage filtering with intermediate logic\n\nFor AI agents: Only use script-based filtering when expression-based filtering is insufficient.\nScript filtering requires maintaining custom code, which adds complexity to the integration.\n","properties":{"_scriptId":{"type":"string","description":"Reference to the Script resource that contains the filtering logic. This must be a valid\nObjectId of a Script resource in this account: any other id fails the save with 422\n(\"Only a script owned by the user or a script shared by the Integration App can be used\nat filter.script._scriptId.\").\n\nThe referenced script must contain the function specified in the `function` field\nand must be written to handle filtering specifically. The script receives\nitem data as its input and must return a boolean value indicating whether\nto process the item (true) or skip it (false).\n\nFormat: 24-character hexadecimal string (MongoDB ObjectId)\n"},"function":{"type":"string","description":"Name of the function within the script to execute for filtering decisions. This function\nmust exist in the script referenced by _scriptId.\n\n**Function requirements**\n\nThe specified function must:\n- Accept item data as its first parameter\n- Return a boolean value (true to process the item, false to skip it)\n- Handle errors gracefully\n- Execute efficiently (as it may run for many items)\n\n**Function signature**\n\n```javascript\nfunction filterItems(itemData) {\n  // itemData contains properties of the item being evaluated\n  // Custom logic here\n  return true; // or false to skip the item\n}\n```\n\nFor AI agents: Ensure the function name exactly matches a function defined in the\nreferenced script, as mismatches will cause the filter to fail.\n"}}}}},"ResourceResponse":{"type":"object","description":"Response","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for the resource. Format is a 24-character hexadecimal string."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was created. Set automatically and cannot be modified."},"lastModified":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was last updated. Changes whenever any property is modified."},"deletedAt":{"type":["string","null"],"format":"date-time","readOnly":true,"description":"Timestamp when the resource was soft-deleted. When null or absent, the resource is active."}},"required":["_id"]},"HTTPConnectorResource":{"type":"object","required":["_id","_httpConnectorId","name","published","createdAt","lastModified"],"description":"HTTP Connector Resource as returned by `GET /v1/httpconnectorresources`,\n`GET /v1/httpconnectorresources/{_id}`, and the nested\n`GET /v1/httpconnectors/{_httpConnectorId}/{_id}` — all three return the\nsame object. Optional fields that were never set are absent.","allOf":[{"$ref":"#/components/schemas/HTTPConnectorResourceBase"},{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for the resource. Doubles as the\n`_httpConnectorResourceId` path parameter of the HTTP Connector\nEndpoints API."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was created."},"lastModified":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was last updated. Changes on every PUT."}}}]},"HTTPConnectorResourceBase":{"type":"object","description":"Writable fields shared by the request and response schemas.","properties":{"name":{"type":"string","description":"Human-readable name of the API resource this grouping represents (for example \"Account\", \"Contact\", \"Order\")."},"published":{"type":"boolean","default":false,"description":"When true, the resource is visible to users of the connector's\npublished catalog. Only resources whose owner may publish HTTP\nconnectors appear to other accounts."},"_httpConnectorId":{"type":"string","format":"objectId","description":"HTTP Connector this resource belongs to. Must be a connector owned by\nthe caller's account."},"_httpConnectorApiId":{"type":"string","format":"objectId","description":"API group (an entry of the connector's `apis[]`) this resource belongs\nto. Set only for grouped connectors; flat connectors scope resources by\n`_versionIds` instead."},"_versionIds":{"type":"array","description":"Connector (or API group) versions this resource is available in. Each\nid must be one of the connector's `versions[]._id` values.","items":{"type":"string","format":"objectId"}},"_parentResourceId":{"type":"string","format":"objectId","description":"Parent resource when this resource is nested under another one (for\nexample \"Order line\" under \"Order\"). Omit for top-level resources;\ncannot be combined with `isRoot: true`."},"isRoot":{"type":"boolean","default":false,"description":"When true, marks the resource as the root of a resource hierarchy.\nRejected together with `_parentResourceId`."},"metadata":{"type":"object","additionalProperties":true,"description":"Free-form metadata stored with the resource, for example Data Intelligence attributes."},"resourceFields":{"type":"array","description":"Field catalog of the records this resource returns, used by tooling to\ndescribe the API's payloads. Fields nest through their own\n`resourceFields`.","items":{"$ref":"#/components/schemas/ResourceField"}},"supportedBy":{"$ref":"#/components/schemas/ResourceSupportedBy"}}},"ResourceField":{"type":"object","description":"One field of the resource's records, optionally with nested child fields.","required":["id"],"properties":{"id":{"type":"string","description":"Field identifier as it appears in the record."},"label":{"type":"string","description":"Display label for the field."},"description":{"type":"string","description":"Help text describing the field."},"dataType":{"type":"string","description":"Data type label for the field, stored as given."},"metadata":{"type":"object","additionalProperties":true,"description":"Free-form metadata for the field."},"resourceFields":{"type":"array","description":"Child fields of an object or array field. Absent when the field is scalar.","items":{"type":"object","additionalProperties":true,"description":"Nested field with the same shape as its parent."}}}},"ResourceSupportedBy":{"type":"object","description":"Defaults the connector framework applies when a user builds an export or\nan import on one of this resource's endpoints. Each section\npre-configures fields, lists the fields the user must still fill in, and\nclears fields that do not apply.","properties":{"export":{"$ref":"#/components/schemas/ResourceSupportedBySection"},"import":{"allOf":[{"$ref":"#/components/schemas/ResourceSupportedBySection"},{"type":"object","properties":{"pathParameterToIdentifyExisting":{"type":"string","description":"Path parameter whose value identifies the existing record on\nan update or upsert import. Needed only when the endpoint has\nmore than one path parameter."},"lookupToIdentifyExisting":{"type":"object","description":"Lookup the import runs to find out whether a record already\nexists before deciding between create and update. Both\nfields go together — sending one without the other is\nrejected.","properties":{"_httpConnectorEndpointId":{"type":"string","format":"objectId","description":"HTTP Connector Endpoint that performs the lookup. Must be\nan existing endpoint."},"extract":{"type":"string","description":"Path in the lookup response to read the existing record's identifier from."}}}}}]}}},"ResourceSupportedBySection":{"type":"object","description":"Conditions, pre-configured field values, required user inputs, and\nfields to clear for one resource type (export or import) created from\nthis resource.","properties":{"conditions":{"type":"array","description":"Expression-based filters referenced by `_conditionIds` in\n`preConfiguredFields` and `fieldsUserMustSet` to apply those entries\nconditionally.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Identifier of this condition, referenced by `_conditionIds` in field entries."},"condition":{"$ref":"#/components/schemas/Filter"}}}},"preConfiguredFields":{"type":"array","description":"Fields set automatically on the generated export or import. Not editable by the user.","items":{"type":"object","properties":{"path":{"type":"string","description":"Dot-notation name of the setting in the connector's form. It is not always a literal\npath on the generated export or import: a form group such as `response` takes an\nobject value (`{resourcePath: \"customers\"}`) that sets the step's\n`http.response.resourcePath`."},"values":{"type":"array","description":"Value(s) to assign. Typically a single-element array; entries may be any JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this entry to apply. Always applies when absent.","items":{"type":"string","format":"objectId"}}}}},"fieldsUserMustSet":{"type":"array","description":"Fields the user must provide values for on the generated export or import.","items":{"type":"object","properties":{"path":{"type":"string","description":"Dot-notation name of the setting the connector's form asks for: a step field such as\n`ignoreExisting` or `type`, or `mapping.fields.generate.<field>`, a destination field\nthe import's mapping must produce."},"values":{"type":"array","description":"Optional suggested or constrained values. Entries may be any JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this entry to apply.","items":{"type":"string","format":"objectId"}},"helpURL":{"type":"string","description":"URL to documentation for this field."},"labelOverride":{"type":"string","description":"Custom label shown in the UI instead of the default."}}}},"fieldsToUnset":{"type":"array","description":"Dot-notation paths to clear on the generated export or import.","items":{"type":"string"}}}},"HTTPConnectorEndpoint":{"type":"object","required":["_id","name","method","relativeURI","published","isBlob","isMappingRequired","mergePostBodyToPagingPostBody","_httpConnectorResourceIds","createdAt","lastModified"],"description":"HTTP Connector Endpoint as returned by `GET /v1/httpconnectorendpoints`,\n`GET /v1/httpconnectorendpoints/{_id}`, and the nested\n`GET /v1/httpconnectors/{_httpConnectorId}/{_httpConnectorResourceId}/{_id}`\n— all three return the same object. Optional fields that were never set\nare absent.","allOf":[{"$ref":"#/components/schemas/HTTPConnectorEndpointBase"},{"$ref":"#/components/schemas/ResourceResponse"},{"type":"object","properties":{"metadata":{"type":"object","description":"Endpoint metadata used by Data Intelligence tooling. Absent when\nnever set; Data Intelligence attributes can only be stored on a\npublished endpoint.","properties":{"di":{"type":"object","description":"Data Intelligence attributes for this endpoint.","properties":{"isListEndpoint":{"type":"boolean","description":"When true, the endpoint returns a list of records rather than a single record."},"responseFields":{"type":"array","description":"Fields Data Intelligence expects in this endpoint's response records.","items":{"type":"object","properties":{"id":{"type":"string","description":"Field path within a response record."},"dataType":{"type":"string","description":"Data type of the field."}}}}}}}}}}]},"HTTPConnectorEndpointBase":{"type":"object","description":"Writable fields shared by the request and response schemas.","properties":{"name":{"type":"string","description":"Human-readable name for this endpoint, shown when users pick an operation.","maxLength":255},"description":{"type":"string","description":"Help text describing what the endpoint does. Absent when never set.","maxLength":10240},"published":{"type":"boolean","default":false,"description":"When true, this endpoint is visible in the connector's published\ncatalog. Kept as stored when omitted on PUT."},"isBlob":{"type":"boolean","default":false,"description":"When true, this endpoint transfers binary (blob) content instead of records. Kept as stored when omitted on PUT."},"isMappingRequired":{"type":"boolean","default":false,"description":"When true, users must configure field mappings before an import built on this endpoint can run."},"_httpConnectorResourceIds":{"type":"array","minItems":1,"description":"HTTP Connector Resources this endpoint is listed under. Each id must\nbe a resource owned by the caller's account; the endpoint appears in\nthe nested listing of every resource named here.","items":{"type":"string","format":"objectId"}},"method":{"type":"string","enum":["GET","PUT","POST","PATCH","DELETE","HEAD"],"description":"HTTP method for this endpoint. Required on save; lowercase input is\nuppercased automatically."},"relativeURI":{"type":"string","description":"Relative URI template for this endpoint"},"mergePostBodyToPagingPostBody":{"type":"boolean","description":"When true, merges the postBody into pagingPostBody for paginated requests.","default":false},"queryParameters":{"type":"array","description":"Query parameter definitions","items":{"type":"object","properties":{"name":{"type":"string","description":"Parameter name as it appears in the request query string."},"label":{"type":"string","description":"Label shown to users in the UI for this parameter. Defaults to `name` when omitted."},"description":{"type":"string","description":"Help text shown to users explaining what this parameter does."},"required":{"type":"boolean","description":"When true, the user must supply a value for this parameter."},"dataType":{"type":"string","enum":["input","date","select","multiselect","array","number"],"default":"input","description":"UI input type used to collect the parameter value. A free-form text input when omitted."},"values":{"type":"array","description":"Predefined values offered when `dataType` is `select` or `multiselect`.","items":{"type":"string"}}},"required":["name"]}},"pathParameters":{"type":"array","description":"Path parameter definitions","items":{"type":"object","properties":{"name":{"type":"string","description":"Parameter name as it appears in the `relativeURI` template."},"label":{"type":"string","description":"Label shown to users in the UI for this parameter. Defaults to `name` when omitted."},"description":{"type":"string","description":"Help text shown to users explaining what this parameter does."},"required":{"type":"boolean","description":"When true, the user must supply a value for this parameter."},"dataType":{"type":"string","enum":["input","date","select","multiselect","array","number"],"default":"input","description":"UI input type used to collect the parameter value. A free-form text input when omitted."},"values":{"type":"array","description":"Predefined values offered when `dataType` is `select` or `multiselect`.","items":{"type":"string"}}},"required":["name"]}},"resourceFields":{"type":"array","description":"Resource field definitions for this endpoint","items":{"type":"object","properties":{"type":{"type":"string","enum":["inclusion","exclusion"],"description":"Whether `fields` lists the fields to include or to exclude."},"fields":{"type":"array","description":"Field names the inclusion or exclusion rule applies to.","items":{"type":"string"}},"_httpConnectorResourceId":{"type":"string","format":"objectId","description":"HTTP Connector Resource these field rules apply to."}},"required":["type","fields","_httpConnectorResourceId"]}},"supportedBy":{"type":"object","description":"How the connector framework turns this endpoint into an export or an\nimport: which one it becomes, the fields it pre-configures, and the\nfields the user must still fill in. Each entry's `path` names a setting\nin the connector's form, which is not always a literal path on the\ngenerated export or import.","required":["type"],"properties":{"type":{"type":"string","enum":["import","export"],"description":"Whether this endpoint is consumed as an import or an export. Also\nthe value the nested listing's `supportedByType` filter matches."},"conditions":{"type":"array","description":"Expression-based filters that control when entries in `preConfiguredFields` and `fieldsUserMustSet` apply.","items":{"type":"object","additionalProperties":true}},"preConfiguredFields":{"type":"array","description":"Fields automatically set to predefined values on the generated export or import. Not editable by the user.","items":{"type":"object","additionalProperties":true}},"fieldsUserMustSet":{"type":"array","description":"Fields the user must provide values for on the generated export or import.","items":{"type":"object","additionalProperties":true}},"fieldsToUnset":{"type":"array","description":"Dot-notation paths of fields to remove from the generated export or import configuration.","items":{"type":"string"}},"pathParameterToIdentifyExisting":{"type":"string","description":"Path parameter whose value identifies an existing record in the target application."},"lookupToIdentifyExisting":{"type":"object","description":"Lookup used to determine whether a record already exists in the target application.","properties":{"_httpConnectorEndpointId":{"type":"string","format":"objectId","description":"HTTP Connector Endpoint used to perform the lookup."},"extract":{"type":"string","description":"Path in the lookup response from which to extract the existing record's identifier."}}}}}}},"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}},"responses":{"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}},"403-forbidden":{"description":"Forbidden. The authenticated caller does not have permission to perform this operation.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404-not-found":{"description":"Not found. The requested resource does not exist or is not visible to the caller.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/v1/httpconnectors/{_id}":{"get":{"operationId":"getHttpConnectorById","tags":["HTTP Connectors"],"summary":"Get an HTTP connector","description":"Retrieves the full HTTP Connector object including `published`,\n`baseURIs`, `supportedBy`, and version details omitted from the\nlist endpoint.","parameters":[{"in":"path","name":"_id","required":true,"schema":{"type":"string","format":"objectId"},"description":"HTTP Connector ID."},{"in":"query","name":"returnEverything","required":false,"schema":{"type":"boolean"},"description":"When true, the response adds `httpConnectorResources` and\n`httpConnectorEndpoints`: the connector's resources and the endpoints\nunder them, in one call. Only the exact value `true` fills them. Any\nother non-empty value, including `false`, adds both arrays empty, and an\nabsent or empty parameter leaves them out. The `true` response is\nstreamed without a `Content-Length` header, and for a connector with\nmany endpoints it can exceed 1 MB."}],"responses":{"200":{"description":"HTTP Connector retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPConnector"}}}},"401":{"$ref":"#/components/responses/401-unauthorized"},"403":{"$ref":"#/components/responses/403-forbidden"},"404":{"$ref":"#/components/responses/404-not-found"}}}}}}
````

## Update an HTTP connector

> Replaces the HTTP Connector with the provided fields.

````json
{"openapi":"3.2.0","info":{"title":"HTTP Connectors","version":"1.0.0"},"tags":[{"name":"HTTP Connectors","description":"HTTP Connectors define reusable API frameworks — base URIs, versioning\nstrategies, authentication presets, and supported-by rules — that\nHTTP connections, iClients, imports, and exports inherit.\n\nEach connector has one or more versions and may group multiple API\nproducts under `apis[]`. Child resources (HTTP Connector Resources\nand Endpoints) define the specific operations available.\n\nTwo structural patterns exist:\n- **Flat** — versions and baseURIs sit directly on the connector.\n  Most connectors use this pattern.\n- **Grouped** — the connector nests API products under `apis[]`,\n  each with its own versions and baseURIs.\n\n## HTTP connector schema\n\n{% openapi-schemas spec=\"httpconnector\" schemas=\"HTTPConnector\" grouped=\"true\" %}"}],"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"},{"url":"https://api.au.integrator.io","description":"Production (AU region)"},{"url":"https://api.ca.integrator.io","description":"Production (CA region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"Request":{"type":"object","description":"Fields for creating or updating an HTTP Connector. `name` is always\nrequired. On create, provide either `versions` (flat connector) or\n`apis` (grouped connector) -- most connectors use the flat pattern.","required":["name"],"allOf":[{"$ref":"#/components/schemas/HTTPConnectorBase"}]},"HTTPConnectorBase":{"type":"object","description":"Writable fields shared by the request and response schemas.","properties":{"name":{"type":"string","description":"Display name for this HTTP Connector.","maxLength":255},"published":{"type":"boolean","description":"When true, this connector is visible to users."},"baseURIs":{"type":"array","description":"Base URI templates (used when `apis` is empty).","items":{"type":"string"}},"helpURL":{"type":"string","description":"Documentation URL shown to users when configuring this connector."},"legacyId":{"type":"string","description":"Legacy assistant ID for backward compatibility."},"isGraphQL":{"type":"boolean","description":"When true, this connector targets a GraphQL API."},"requireBodyMatchForLinking":{"type":"boolean","description":"Require request body matching when auto-linking exports/imports."},"disableAutoLinking":{"type":"boolean","description":"Disable automatic linking of exports/imports to this connector."},"versioning":{"$ref":"#/components/schemas/Versioning"},"versions":{"type":"array","description":"Connector versions (used when `apis` is empty).","items":{"$ref":"#/components/schemas/Version"}},"apis":{"type":"array","description":"API groups under this connector. Each group has its own versions, baseURIs, and supportedBy config.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for this API group."},"name":{"type":"string","description":"Display name for this API group."},"description":{"type":"string","maxLength":10240,"description":"Explains what this API group covers, shown to users when selecting an API."},"published":{"type":"boolean","description":"When true, this API group is visible to users."},"baseURIs":{"type":"array","description":"Base URI templates used for requests targeting this API group.","items":{"type":"string"}},"helpURL":{"type":"string","description":"Documentation URL shown to users when configuring this API group."},"legacyId":{"type":"string","description":"Legacy assistant ID for backward compatibility."},"isGraphQL":{"type":"boolean","description":"When true, this API group targets a GraphQL API."},"versioning":{"$ref":"#/components/schemas/Versioning"},"versions":{"type":"array","description":"Versions available under this API group.","items":{"$ref":"#/components/schemas/Version"}},"supportedBy":{"$ref":"#/components/schemas/SupportedBy"},"setDefault":{"type":"boolean","description":"When true, this API group is the connector's default selection."}}}},"supportedBy":{"allOf":[{"$ref":"#/components/schemas/SupportedBy"}]},"preBuiltExports":{"type":"array","description":"Pre-built export templates associated with this connector.","items":{"type":"object","properties":{"_exportId":{"type":"string","format":"objectId","description":"Export resource that serves as the pre-built template."},"published":{"type":"boolean","description":"When true, this pre-built export is visible to users."}},"required":["_exportId"]}},"preBuiltImports":{"type":"array","description":"Pre-built import templates associated with this connector.","items":{"type":"object","properties":{"_importId":{"type":"string","format":"objectId","description":"Import resource that serves as the pre-built template."},"published":{"type":"boolean","description":"When true, this pre-built import is visible to users."}},"required":["_importId"]}}}},"Versioning":{"type":"object","description":"Strategy for how API versions are passed in requests. Used at the\nconnector level and per API group; both use the same shape.","properties":{"location":{"type":"string","enum":["uri","query_parameter","header"],"description":"Where the version identifier is placed in outgoing requests."},"headerName":{"type":"string","description":"Header name when `location` is `header`."},"queryParameterName":{"type":"string","description":"Query parameter name when `location` is `query_parameter`."}}},"Version":{"type":"object","description":"A version of the connector (or of an API group). Both contexts use the\nsame shape.","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for this version."},"name":{"type":"string","description":"Display name for this version (e.g. `v3`)."},"published":{"type":"boolean","description":"When true, this version is visible to users."},"baseURIs":{"type":"array","description":"Base URI templates used for requests targeting this version.","items":{"type":"string"}},"supportedBy":{"$ref":"#/components/schemas/SupportedBy"}}},"SupportedBy":{"type":"object","description":"Framework-defined defaults that pre-configure fields and prompt users\nwhen a connection, export, import, or iClient is created from this\nconnector (or from a specific version / API group).","properties":{"connection":{"$ref":"#/components/schemas/SupportedBySection"},"export":{"$ref":"#/components/schemas/SupportedBySection"},"import":{"$ref":"#/components/schemas/SupportedBySection"},"iClient":{"$ref":"#/components/schemas/SupportedBySection"}}},"SupportedBySection":{"type":"object","description":"Conditions, pre-configured field values, and fields the user must set\nfor one resource type (connection, export, import, or iClient) when it\nis created from this connector. All four sections share this shape.","properties":{"preConfiguredFields":{"type":"array","description":"Fields automatically set on the target resource. Not editable by the user.","items":{"$ref":"#/components/schemas/SupportedByPreConfiguredField"}},"fieldsUserMustSet":{"type":"array","description":"Fields the user must provide values for when creating the target resource.","items":{"$ref":"#/components/schemas/SupportedByFieldUserMustSet"}},"fieldsToUnset":{"type":"array","description":"Field paths to clear on the target resource."},"conditions":{"type":"array","description":"Expression-based filters referenced by `_conditionIds` in\n`preConfiguredFields` and `fieldsUserMustSet` to conditionally\napply those field configurations.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for this condition, referenced by `_conditionIds` in field entries."},"condition":{"$ref":"#/components/schemas/Filter"}}}}}},"SupportedByPreConfiguredField":{"type":"object","description":"A field automatically set to a predefined value on the target resource.","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for this field entry."},"path":{"type":"string","description":"Dot-notation path of the field on the target resource."},"values":{"type":"array","description":"Value(s) to assign. Typically a single-element array; entries may be\nany JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this field to apply. If absent, always applies.","items":{"type":"string","format":"objectId"}}}},"SupportedByFieldUserMustSet":{"type":"object","description":"A field the user must provide a value for when creating the target resource.","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for this field entry."},"path":{"type":"string","description":"Dot-notation path of the field on the target resource."},"values":{"type":"array","description":"Optional suggested or constrained values. Entries may be any JSON\ntype."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this field to apply.","items":{"type":"string","format":"objectId"}},"helpURL":{"type":"string","description":"URL to documentation for this field."},"labelOverride":{"type":"string","description":"Custom label to display in the UI instead of the default."},"inputType":{"type":"string","enum":["number","password","uri"],"description":"UI input widget type shown when prompting the user for this field.\nUses the same widget vocabulary as Trading Partner Connectors."}}},"Filter":{"type":"object","description":"Configuration for selectively processing records based on specified criteria. This object enables\nprecise control over which items are included or excluded from processing operations.\n\n**Filter behavior**\n\nWhen configured, the filter is applied before processing begins:\n- Items that match the filter criteria are processed\n- Items that don't match are completely skipped\n- No partial processing is performed\n\nSend the whole object. A rules array sent alone as the `filter` value is not\nstored, and a full update of an export that carries one removes the filter the\nexport had, with no error.\n\n**Implementation approaches**\n\nThere are two distinct filtering mechanisms available:\n\n**Rule-Based Filtering (`type: \"expression\"`)**\n- **Best For**: Common filtering patterns based on standard attributes\n- **Capabilities**: Filter by names, values, dates, numerical ranges, text patterns\n- **Advantages**: Declarative, no coding required, consistent performance\n- **Configuration**: Define rules in the `expression` object\n- **Use When**: You have clear, static criteria for selection\n\n**Script-Based Filtering (`type: \"script\"`)**\n- **Best For**: Complex logic, dynamic criteria, or business rules\n- **Capabilities**: Full programmatic control, access to complete metadata\n- **Advantages**: Maximum flexibility, can implement any filtering logic\n- **Configuration**: Reference a script in the `script` object\n- **Use When**: Simple rules aren't sufficient or logic needs to be dynamic\n","properties":{"type":{"type":"string","description":"Determines which filtering mechanism to use. This choice affects which properties\nmust be configured and how filtering logic is implemented.\n\n**Available types**\n\n**Rule-Based Filtering (`\"expression\"`)**\n- **Required Config**: The `expression` object with rule definitions\n- **Behavior**: Evaluates declarative rules against item attributes\n- **Best For**: Common patterns like name matching, date ranges, value limits\n- **Advantages**: Simpler to configure, no custom code required\n\n**Script-Based Filtering (`\"script\"`)**\n- **Required Config**: The `script` object with _scriptId and function\n- **Behavior**: Executes custom JavaScript to determine which items to process\n- **Best For**: Complex conditions, business logic, dynamic criteria\n- **Advantages**: Maximum flexibility, can implement any logic\n\n**Implementation guidance**\n\n1. For standard filtering needs (name, size, date), use `\"expression\"`\n2. For complex logic or conditions not covered by expressions, use `\"script\"`\n3. When selecting a type, you must configure the corresponding object:\n    - `type: \"expression\"` requires the `expression` object\n    - `type: \"script\"` requires the `script` object\n","enum":["expression","script"]},"expression":{"type":"object","description":"Configuration for declarative rule-based filtering. This object enables filtering\nitems based on common attributes without requiring custom code.\n\n**Usage context**\n\nThis object is REQUIRED when `filter.type` is set to \"expression\" and should not be\nconfigured otherwise. It provides a standardized way to define filtering rules that\ncan match against item attributes like name, type, value, date, and other properties.\n\n**Implementation guidance**\n\nThe expression system uses a rule-based approach where:\n- Rules can be combined with AND/OR logic\n- Each rule can check a specific attribute\n- Multiple conditions can be applied (ranges, pattern matching, exact matches)\n\n**Common filter patterns**\n\n1. **Pattern matching**: Regular expressions with `matches`\n2. **Value range filtering**: Numbers between min and max values\n3. **Date range filtering**: Items created/modified within specific time ranges\n4. **Status checking**: Items with specific status values or properties\n\nFor AI agents: Rule-based filtering should be your first choice when the filtering criteria\ncan be expressed in terms of standard attributes. Only use script-based filtering when\nmore complex logic is required.\n","properties":{"version":{"type":"string","description":"Version identifier for the expression format. Currently only version \"1\" is supported.\n\nThis field ensures future compatibility if the expression format evolves. Always set to \"1\"\nfor current implementations.\n","enum":["1"]},"rules":{"type":"array","description":"Expression array defining filter conditions using prefix notation. The first element is the operator,\nfollowed by its operands which may themselves be nested expression arrays.\n\nThe rule expression follows this pattern:\n- First element: Operator name (string)\n- Remaining elements: Operands for that operator (values or nested expressions)\n\n**Expression structure**\n\nFilter expressions use a prefix notation where operators appear before their operands:\n```\n[operator, operand1, operand2, ...]\n```\n\n**Comparison Operators**\n- `\"equals\"`: Exact match (equals)\n- `\"notequals\"`: Not equal to value (not equals)\n- `\"greaterthan\"`: Value is greater than specified value (is greater than)\n- `\"greaterthanequals\"`: Value is greater than or equal to specified value (is greater than or equals)\n- `\"lessthan\"`: Value is less than specified value (is less than)\n- `\"lessthanequals\"`: Value is less than or equal to specified value (is less than or equals)\n- `\"startswith\"`: String starts with specified prefix (starts with)\n- `\"notstartswith\"`: String does not start with specified prefix (does not start with)\n- `\"endswith\"`: String ends with specified suffix (ends with)\n- `\"notendswith\"`: String does not end with specified suffix (does not end with)\n- `\"contains\"`: String contains specified substring (contains)\n- `\"doesnotcontain\"`: String does not contain specified substring (does not contain)\n- `\"empty\"`: Field is missing or empty (is empty)\n- `\"notempty\"`: Field contains a value (is not empty)\n- `\"matches\"`: Matches a regular expression, ignoring case (matches)\n\nOperator names are case-insensitive: `NOTEMPTY` and `endsWith` work and are stored\nas sent. `isempty`, `isnotempty`, `anyof`, `notcontains`, `doesnotstartwith`,\n`doesnotendwith`, `notmatches`, `doesnotmatch` and `notequal` are not operators:\nthey are refused with 422 \"Invalid operation: <name>\", with the name in lowercase,\nboth when the filter is saved and by `POST /v1/processors/filter`. To negate a\ncondition, wrap it in `not`.\n\nThe string comparisons (`equals`, `contains`, `startswith`, `endswith` and their\nnegations) are case-sensitive; wrap the field in `lowercase` to compare without case.\n`matches` is not: every pattern is compiled with the flags `gi`, so `^paid$` also\nmatches `PAID` and `[a-z]` matches capital letters. An inline flag such as `(?i)`\nmakes the pattern invalid. The filter still saves, but in a run every record fails\nwith `FILTER_EVALUATION_FAILED` (\"Invalid regular expression: /(?i)…/gi: Invalid\ngroup\"), and `POST /v1/processors/filter` refuses the call with 422 (live-verified\n2026-10-22).\n\n**Logical Operators**\n- `\"and\"`: All conditions must be true\n- `\"or\"`: At least one condition must be true\n- `\"not\"`: Negates the condition\n\n**Field Access and Type Conversion**\n- `\"extract\"`: Access a field from the item by name\n- `\"settings\"`: Access a custom setting from the flow, flow step, or integration configuration\n- `\"boolean\"`: Convert value to Boolean type\n- `\"epochtime\"`: Convert value to Epoch Time (Unix timestamp)\n- `\"number\"`: Convert value to Number type\n- `\"string\"`: Convert value to String type\n\n**Field Access Details**\n\n**Using `extract` to access record fields:**\n- Retrieves values from the current record being processed\n- Can access nested properties using dot notation (e.g., `\"customer.email\"`)\n- Paths are relative to the record itself: `[\"extract\", \"record.status\"]`\n  matches nothing\n- In a record filter, must be wrapped in a type conversion (`string`, `number`,\n  `boolean` or `epochtime`): a bare `[\"extract\", ...]` operand is refused with 422\n  \"Field operation extract must be called by a Type Conversion Operation but was called\n  by <operator>\", both when an import's filter is saved and by\n  `POST /v1/processors/filter`\n\n**Using `settings` to access configuration values:**\n- Retrieves values from the integration's configuration settings\n- Supports different scopes with prefix notation:\n  - `flow.settingName`: Access flow-level settings\n  - `flowGrouping.settingName`: Access the flow group's settings\n  - `export.settingName`: Access the export's (or lookup's) own settings\n  - `import.settingName`: Access the import's own settings\n  - `integration.settingName`: Access integration-level settings\n  - `connection.settingName`, `iClient.settingName`: Access the step's\n    connection and iClient settings\n- A scope whose resource has no settings can be absent; a rule that reads\n  it matches nothing\n- Must be wrapped in a type conversion like `extract`: a bare\n  `[\"settings\", ...]` operand is refused with 422 \"Field operation settings\n  must be called by a Type Conversion Operation\"\n- Useful for dynamic filtering based on configuration\n\n**Field Transformations**\n- `\"lowercase\"`: Convert string to lowercase\n- `\"uppercase\"`: Convert string to uppercase\n- `\"ceiling\"`: Round number up to the nearest integer\n- `\"floor\"`: Round number down to the nearest integer\n- `\"abs\"`: Get absolute value of a number\n\n**Arithmetic** (number operands)\n- `\"add\"`, `\"subtract\"`, `\"multiply\"`, `\"divide\"`, `\"modulo\"`: for example\n  `[\"subtract\", [\"number\", [\"extract\", \"total\"]], [\"number\", [\"extract\", \"discount\"]]]`.\n  `mod` is not an operator (422 \"Invalid operation: mod.\").\n\n**Dates**\n- `epochtime` reads ISO 8601 strings and epoch-millisecond numbers. An empty\n  string, a string that isn't a date, or epoch milliseconds sent as a string\n  fail it with \"Invalid date. Cannot convert given string or number to date\n  time.\", followed by `; record=` and the record as JSON: in a run that record fails (`FILTER_EVALUATION_FAILED`, source\n  `output_filter` on an export), and `POST /v1/processors/filter` and an\n  export preview refuse the whole call with 422. `and` and `or` evaluate\n  every operand, so a `notempty` test beside it doesn't prevent the failure.\n  A missing or null field doesn't match.\n- `datetime`, `date` and `timestamp` are not type conversions: 422\n  \"Invalid operation: <name>.\"\n- `number` reads a missing or empty field as 0.\n\n**Handlebars operands**\n- An operand can also be a string holding exactly one Handlebars expression, such as\n  `\"{{record.status}}\"` or `\"{{lowercase record.code}}\"`, on either side of the\n  operator. It renders against the record (`record.<field>`; an unprefixed\n  `{{status}}` renders empty) before the comparison.\n- The rendered value is a string: wrap it in `[\"number\", ...]` to compare it with a\n  number, or the rule is refused with 422.\n- `epochtime` does not render Handlebars: `[\"epochtime\", \"{{timestamp}}\"]` is refused\n  with 422 \"invalid datetime format\".\n- A string with text around the expression, or with more than one expression, is\n  compared as a literal.\n- `[\"number\", \"{{timestamp \\\"x\\\"}}\"]` is the current time in epoch milliseconds,\n  so `[\"greaterthanequals\", [\"epochtime\", [\"extract\", \"created\"]], [\"subtract\",\n  [\"number\", \"{{timestamp \\\"x\\\"}}\"], 604800000]]` keeps records created in the\n  last 7 days.\n- An unknown helper fails the rule with 422 \"Failed to evaluate handlebars\n  expression\".\n\nChoose the type conversion that matches the comparison — `number` for numeric\ncomparisons, `epochtime` for dates, `string` for text. For example:\n\n```json\n[\n  \"equals\",\n  [\n    \"number\",  // Convert to number before comparison\n    [\n      \"extract\",\n      \"quantity\"\n    ]\n  ],\n  100\n]\n```\n\nExample with datetime conversion:\n```json\n[\n  \"greaterthan\",\n  [\n    \"epochtime\",  // Convert to Unix timestamp before comparison\n    [\n      \"extract\",\n      \"createdDate\"\n    ]\n  ],\n  1609459200000  // January 1, 2021 as Unix timestamp in milliseconds\n]\n```\n\nExample with transformations:\n```json\n[\n  \"and\",\n  [\n    \"matches\",\n    [\n      \"lowercase\",  // Convert to lowercase before matching\n      [\n        \"string\",\n        [\n          \"extract\",\n          \"categories\"\n        ]\n      ]\n    ],\n    \"netsuite\"\n  ],\n  [\n    \"notequals\",\n    [\n      \"string\",\n      [\n        \"extract\",\n        \"recurrence.pattern.type\"\n      ]\n    ],\n    \"\"\n  ]\n]\n```\n\nExample comparing a record field with a flow setting:\n```json\n[\n  \"equals\",\n  [\n    \"string\",\n    [\n      \"extract\",\n      \"trantype\"\n    ]\n  ],\n  [\n    \"string\",\n    [\n      \"settings\",\n      \"flow.trantype\"\n    ]\n  ]\n]\n```\n\n**Examples**\n\nExample 1: Status field is not equal to \"cancelled\"\n```json\n[\n  \"notequals\",\n  [\n    \"string\",\n    [\n      \"extract\",\n      \"status\"\n    ]\n  ],\n  \"cancelled\"\n]\n```\n\nExample 2: Filename starts with \"HC\"\n```json\n[\n  \"startswith\",\n  [\n    \"string\",\n    [\n      \"extract\",\n      \"filename\"\n    ]\n  ],\n  \"HC\"\n]\n```\n\nExample 3: Amount is greater than 100\n```json\n[\n  \"greaterthan\",\n  [\n    \"number\",\n    [\n      \"extract\",\n      \"amount\"\n    ]\n  ],\n  100\n]\n```\n\nExample 4: Order date is after January 1, 2023 (UTC). Compare dates as `epochtime`\nagainst epoch milliseconds: a `string` comparison of ISO timestamps orders values with\ndifferent UTC offsets wrongly.\n```json\n[\n  \"greaterthan\",\n  [\n    \"epochtime\",\n    [\n      \"extract\",\n      \"orderDate\"\n    ]\n  ],\n  1672531200000\n]\n```\n","items":{"oneOf":[{"title":"String","type":"string"},{"title":"Number","type":"number"},{"title":"Boolean","type":"boolean"},{"title":"Object","type":"object"},{"title":"Array","type":"array"},{"title":"Null","type":"null"}]}}}},"script":{"type":"object","description":"Configuration for programmable script-based filtering. This object enables complex, custom\nfiltering logic beyond what expression-based filtering can provide.\n\n**Usage context**\n\nThis object is REQUIRED when `filter.type` is set to \"script\" and should not be configured\notherwise. It provides a way to execute custom JavaScript code to determine which items\nshould be processed.\n\n**Implementation approach**\n\nScript-based filtering works by:\n1. Executing the specified function from the referenced script\n2. Passing item data to the function\n3. Using the function's return value (true/false) to determine inclusion\n\n**Common use cases**\n\nScript filtering is ideal for:\n- Complex business logic that can't be expressed as simple rules\n- Dynamic filtering criteria that change based on external factors\n- Content-based filtering that requires deep inspection\n- Advanced pattern matching beyond simple wildcards\n- Multi-stage filtering with intermediate logic\n\nFor AI agents: Only use script-based filtering when expression-based filtering is insufficient.\nScript filtering requires maintaining custom code, which adds complexity to the integration.\n","properties":{"_scriptId":{"type":"string","description":"Reference to the Script resource that contains the filtering logic. This must be a valid\nObjectId of a Script resource in this account: any other id fails the save with 422\n(\"Only a script owned by the user or a script shared by the Integration App can be used\nat filter.script._scriptId.\").\n\nThe referenced script must contain the function specified in the `function` field\nand must be written to handle filtering specifically. The script receives\nitem data as its input and must return a boolean value indicating whether\nto process the item (true) or skip it (false).\n\nFormat: 24-character hexadecimal string (MongoDB ObjectId)\n"},"function":{"type":"string","description":"Name of the function within the script to execute for filtering decisions. This function\nmust exist in the script referenced by _scriptId.\n\n**Function requirements**\n\nThe specified function must:\n- Accept item data as its first parameter\n- Return a boolean value (true to process the item, false to skip it)\n- Handle errors gracefully\n- Execute efficiently (as it may run for many items)\n\n**Function signature**\n\n```javascript\nfunction filterItems(itemData) {\n  // itemData contains properties of the item being evaluated\n  // Custom logic here\n  return true; // or false to skip the item\n}\n```\n\nFor AI agents: Ensure the function name exactly matches a function defined in the\nreferenced script, as mismatches will cause the filter to fail.\n"}}}}},"HTTPConnector":{"type":"object","required":["_id","_userId","name","createdAt","lastModified"],"description":"HTTP Connector object as returned by the detail (by-ID) endpoint.","allOf":[{"$ref":"#/components/schemas/HTTPConnectorBase"},{"$ref":"#/components/schemas/ResourceResponse"},{"type":"object","properties":{"_userId":{"type":"string","format":"objectId","description":"User who created this connector.","readOnly":true},"legacyIds":{"type":"array","description":"All legacy assistant IDs associated with this connector.","readOnly":true,"items":{"type":"string"}},"supportsIClient":{"type":"boolean","description":"When true, this connector supports shared iClient credentials.","readOnly":true},"supportsWebhook":{"type":"boolean","description":"When true, this connector supports webhook-based exports.","readOnly":true},"hasBlobEndpoints":{"type":"boolean","description":"When true, at least one endpoint under this connector handles binary/blob data.","readOnly":true},"metadataLoadStrategy":{"type":"string","enum":["staged"],"readOnly":true,"description":"Present only when the connector uses staged metadata loading. Omitted\nwhen the stored strategy is `full`."},"__numOfBlobEndpoints":{"type":"number","description":"Number of blob endpoints for this connector","readOnly":true},"httpConnectorResources":{"type":"array","readOnly":true,"description":"Only present on GET /v1/httpconnectors/{_id} with a non-empty\n`returnEverything`, and empty unless it is exactly `true`. The\nconnector's resources, sorted by `_id`: the same set\n`GET /v1/httpconnectors/{_httpConnectorId}/httpconnectorresources` lists.","items":{"$ref":"#/components/schemas/HTTPConnectorResource"}},"httpConnectorEndpoints":{"type":"array","readOnly":true,"description":"Only present on GET /v1/httpconnectors/{_id} with a non-empty\n`returnEverything`, and empty unless it is exactly `true`. The\nendpoints of the returned resources, grouped in resource order.","items":{"$ref":"#/components/schemas/HTTPConnectorEndpoint"}},"metadata":{"type":"object","readOnly":true,"description":"Connector metadata used by Data Intelligence tooling. Returned\nonly by the detail (by-ID) endpoint — list responses omit it.","properties":{"di":{"type":"object","description":"Data Intelligence attributes for this connector.","properties":{"isSourceOnboard":{"type":"boolean","description":"When true, the connector is onboarded as a Data Intelligence source."},"apiResolution":{"type":"object","description":"Which API group and version Data Intelligence resolves this\nconnector to. Present only on connectors with multiple API\ngroups or versions.","properties":{"api":{"type":"string","description":"Name of the resolved API group."},"version":{"type":"string","description":"Name of the resolved version."}}}}}}}}}]},"ResourceResponse":{"type":"object","description":"Response","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for the resource. Format is a 24-character hexadecimal string."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was created. Set automatically and cannot be modified."},"lastModified":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was last updated. Changes whenever any property is modified."},"deletedAt":{"type":["string","null"],"format":"date-time","readOnly":true,"description":"Timestamp when the resource was soft-deleted. When null or absent, the resource is active."}},"required":["_id"]},"HTTPConnectorResource":{"type":"object","required":["_id","_httpConnectorId","name","published","createdAt","lastModified"],"description":"HTTP Connector Resource as returned by `GET /v1/httpconnectorresources`,\n`GET /v1/httpconnectorresources/{_id}`, and the nested\n`GET /v1/httpconnectors/{_httpConnectorId}/{_id}` — all three return the\nsame object. Optional fields that were never set are absent.","allOf":[{"$ref":"#/components/schemas/HTTPConnectorResourceBase"},{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for the resource. Doubles as the\n`_httpConnectorResourceId` path parameter of the HTTP Connector\nEndpoints API."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was created."},"lastModified":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was last updated. Changes on every PUT."}}}]},"HTTPConnectorResourceBase":{"type":"object","description":"Writable fields shared by the request and response schemas.","properties":{"name":{"type":"string","description":"Human-readable name of the API resource this grouping represents (for example \"Account\", \"Contact\", \"Order\")."},"published":{"type":"boolean","default":false,"description":"When true, the resource is visible to users of the connector's\npublished catalog. Only resources whose owner may publish HTTP\nconnectors appear to other accounts."},"_httpConnectorId":{"type":"string","format":"objectId","description":"HTTP Connector this resource belongs to. Must be a connector owned by\nthe caller's account."},"_httpConnectorApiId":{"type":"string","format":"objectId","description":"API group (an entry of the connector's `apis[]`) this resource belongs\nto. Set only for grouped connectors; flat connectors scope resources by\n`_versionIds` instead."},"_versionIds":{"type":"array","description":"Connector (or API group) versions this resource is available in. Each\nid must be one of the connector's `versions[]._id` values.","items":{"type":"string","format":"objectId"}},"_parentResourceId":{"type":"string","format":"objectId","description":"Parent resource when this resource is nested under another one (for\nexample \"Order line\" under \"Order\"). Omit for top-level resources;\ncannot be combined with `isRoot: true`."},"isRoot":{"type":"boolean","default":false,"description":"When true, marks the resource as the root of a resource hierarchy.\nRejected together with `_parentResourceId`."},"metadata":{"type":"object","additionalProperties":true,"description":"Free-form metadata stored with the resource, for example Data Intelligence attributes."},"resourceFields":{"type":"array","description":"Field catalog of the records this resource returns, used by tooling to\ndescribe the API's payloads. Fields nest through their own\n`resourceFields`.","items":{"$ref":"#/components/schemas/ResourceField"}},"supportedBy":{"$ref":"#/components/schemas/ResourceSupportedBy"}}},"ResourceField":{"type":"object","description":"One field of the resource's records, optionally with nested child fields.","required":["id"],"properties":{"id":{"type":"string","description":"Field identifier as it appears in the record."},"label":{"type":"string","description":"Display label for the field."},"description":{"type":"string","description":"Help text describing the field."},"dataType":{"type":"string","description":"Data type label for the field, stored as given."},"metadata":{"type":"object","additionalProperties":true,"description":"Free-form metadata for the field."},"resourceFields":{"type":"array","description":"Child fields of an object or array field. Absent when the field is scalar.","items":{"type":"object","additionalProperties":true,"description":"Nested field with the same shape as its parent."}}}},"ResourceSupportedBy":{"type":"object","description":"Defaults the connector framework applies when a user builds an export or\nan import on one of this resource's endpoints. Each section\npre-configures fields, lists the fields the user must still fill in, and\nclears fields that do not apply.","properties":{"export":{"$ref":"#/components/schemas/ResourceSupportedBySection"},"import":{"allOf":[{"$ref":"#/components/schemas/ResourceSupportedBySection"},{"type":"object","properties":{"pathParameterToIdentifyExisting":{"type":"string","description":"Path parameter whose value identifies the existing record on\nan update or upsert import. Needed only when the endpoint has\nmore than one path parameter."},"lookupToIdentifyExisting":{"type":"object","description":"Lookup the import runs to find out whether a record already\nexists before deciding between create and update. Both\nfields go together — sending one without the other is\nrejected.","properties":{"_httpConnectorEndpointId":{"type":"string","format":"objectId","description":"HTTP Connector Endpoint that performs the lookup. Must be\nan existing endpoint."},"extract":{"type":"string","description":"Path in the lookup response to read the existing record's identifier from."}}}}}]}}},"ResourceSupportedBySection":{"type":"object","description":"Conditions, pre-configured field values, required user inputs, and\nfields to clear for one resource type (export or import) created from\nthis resource.","properties":{"conditions":{"type":"array","description":"Expression-based filters referenced by `_conditionIds` in\n`preConfiguredFields` and `fieldsUserMustSet` to apply those entries\nconditionally.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Identifier of this condition, referenced by `_conditionIds` in field entries."},"condition":{"$ref":"#/components/schemas/Filter"}}}},"preConfiguredFields":{"type":"array","description":"Fields set automatically on the generated export or import. Not editable by the user.","items":{"type":"object","properties":{"path":{"type":"string","description":"Dot-notation name of the setting in the connector's form. It is not always a literal\npath on the generated export or import: a form group such as `response` takes an\nobject value (`{resourcePath: \"customers\"}`) that sets the step's\n`http.response.resourcePath`."},"values":{"type":"array","description":"Value(s) to assign. Typically a single-element array; entries may be any JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this entry to apply. Always applies when absent.","items":{"type":"string","format":"objectId"}}}}},"fieldsUserMustSet":{"type":"array","description":"Fields the user must provide values for on the generated export or import.","items":{"type":"object","properties":{"path":{"type":"string","description":"Dot-notation name of the setting the connector's form asks for: a step field such as\n`ignoreExisting` or `type`, or `mapping.fields.generate.<field>`, a destination field\nthe import's mapping must produce."},"values":{"type":"array","description":"Optional suggested or constrained values. Entries may be any JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this entry to apply.","items":{"type":"string","format":"objectId"}},"helpURL":{"type":"string","description":"URL to documentation for this field."},"labelOverride":{"type":"string","description":"Custom label shown in the UI instead of the default."}}}},"fieldsToUnset":{"type":"array","description":"Dot-notation paths to clear on the generated export or import.","items":{"type":"string"}}}},"HTTPConnectorEndpoint":{"type":"object","required":["_id","name","method","relativeURI","published","isBlob","isMappingRequired","mergePostBodyToPagingPostBody","_httpConnectorResourceIds","createdAt","lastModified"],"description":"HTTP Connector Endpoint as returned by `GET /v1/httpconnectorendpoints`,\n`GET /v1/httpconnectorendpoints/{_id}`, and the nested\n`GET /v1/httpconnectors/{_httpConnectorId}/{_httpConnectorResourceId}/{_id}`\n— all three return the same object. Optional fields that were never set\nare absent.","allOf":[{"$ref":"#/components/schemas/HTTPConnectorEndpointBase"},{"$ref":"#/components/schemas/ResourceResponse"},{"type":"object","properties":{"metadata":{"type":"object","description":"Endpoint metadata used by Data Intelligence tooling. Absent when\nnever set; Data Intelligence attributes can only be stored on a\npublished endpoint.","properties":{"di":{"type":"object","description":"Data Intelligence attributes for this endpoint.","properties":{"isListEndpoint":{"type":"boolean","description":"When true, the endpoint returns a list of records rather than a single record."},"responseFields":{"type":"array","description":"Fields Data Intelligence expects in this endpoint's response records.","items":{"type":"object","properties":{"id":{"type":"string","description":"Field path within a response record."},"dataType":{"type":"string","description":"Data type of the field."}}}}}}}}}}]},"HTTPConnectorEndpointBase":{"type":"object","description":"Writable fields shared by the request and response schemas.","properties":{"name":{"type":"string","description":"Human-readable name for this endpoint, shown when users pick an operation.","maxLength":255},"description":{"type":"string","description":"Help text describing what the endpoint does. Absent when never set.","maxLength":10240},"published":{"type":"boolean","default":false,"description":"When true, this endpoint is visible in the connector's published\ncatalog. Kept as stored when omitted on PUT."},"isBlob":{"type":"boolean","default":false,"description":"When true, this endpoint transfers binary (blob) content instead of records. Kept as stored when omitted on PUT."},"isMappingRequired":{"type":"boolean","default":false,"description":"When true, users must configure field mappings before an import built on this endpoint can run."},"_httpConnectorResourceIds":{"type":"array","minItems":1,"description":"HTTP Connector Resources this endpoint is listed under. Each id must\nbe a resource owned by the caller's account; the endpoint appears in\nthe nested listing of every resource named here.","items":{"type":"string","format":"objectId"}},"method":{"type":"string","enum":["GET","PUT","POST","PATCH","DELETE","HEAD"],"description":"HTTP method for this endpoint. Required on save; lowercase input is\nuppercased automatically."},"relativeURI":{"type":"string","description":"Relative URI template for this endpoint"},"mergePostBodyToPagingPostBody":{"type":"boolean","description":"When true, merges the postBody into pagingPostBody for paginated requests.","default":false},"queryParameters":{"type":"array","description":"Query parameter definitions","items":{"type":"object","properties":{"name":{"type":"string","description":"Parameter name as it appears in the request query string."},"label":{"type":"string","description":"Label shown to users in the UI for this parameter. Defaults to `name` when omitted."},"description":{"type":"string","description":"Help text shown to users explaining what this parameter does."},"required":{"type":"boolean","description":"When true, the user must supply a value for this parameter."},"dataType":{"type":"string","enum":["input","date","select","multiselect","array","number"],"default":"input","description":"UI input type used to collect the parameter value. A free-form text input when omitted."},"values":{"type":"array","description":"Predefined values offered when `dataType` is `select` or `multiselect`.","items":{"type":"string"}}},"required":["name"]}},"pathParameters":{"type":"array","description":"Path parameter definitions","items":{"type":"object","properties":{"name":{"type":"string","description":"Parameter name as it appears in the `relativeURI` template."},"label":{"type":"string","description":"Label shown to users in the UI for this parameter. Defaults to `name` when omitted."},"description":{"type":"string","description":"Help text shown to users explaining what this parameter does."},"required":{"type":"boolean","description":"When true, the user must supply a value for this parameter."},"dataType":{"type":"string","enum":["input","date","select","multiselect","array","number"],"default":"input","description":"UI input type used to collect the parameter value. A free-form text input when omitted."},"values":{"type":"array","description":"Predefined values offered when `dataType` is `select` or `multiselect`.","items":{"type":"string"}}},"required":["name"]}},"resourceFields":{"type":"array","description":"Resource field definitions for this endpoint","items":{"type":"object","properties":{"type":{"type":"string","enum":["inclusion","exclusion"],"description":"Whether `fields` lists the fields to include or to exclude."},"fields":{"type":"array","description":"Field names the inclusion or exclusion rule applies to.","items":{"type":"string"}},"_httpConnectorResourceId":{"type":"string","format":"objectId","description":"HTTP Connector Resource these field rules apply to."}},"required":["type","fields","_httpConnectorResourceId"]}},"supportedBy":{"type":"object","description":"How the connector framework turns this endpoint into an export or an\nimport: which one it becomes, the fields it pre-configures, and the\nfields the user must still fill in. Each entry's `path` names a setting\nin the connector's form, which is not always a literal path on the\ngenerated export or import.","required":["type"],"properties":{"type":{"type":"string","enum":["import","export"],"description":"Whether this endpoint is consumed as an import or an export. Also\nthe value the nested listing's `supportedByType` filter matches."},"conditions":{"type":"array","description":"Expression-based filters that control when entries in `preConfiguredFields` and `fieldsUserMustSet` apply.","items":{"type":"object","additionalProperties":true}},"preConfiguredFields":{"type":"array","description":"Fields automatically set to predefined values on the generated export or import. Not editable by the user.","items":{"type":"object","additionalProperties":true}},"fieldsUserMustSet":{"type":"array","description":"Fields the user must provide values for on the generated export or import.","items":{"type":"object","additionalProperties":true}},"fieldsToUnset":{"type":"array","description":"Dot-notation paths of fields to remove from the generated export or import configuration.","items":{"type":"string"}},"pathParameterToIdentifyExisting":{"type":"string","description":"Path parameter whose value identifies an existing record in the target application."},"lookupToIdentifyExisting":{"type":"object","description":"Lookup used to determine whether a record already exists in the target application.","properties":{"_httpConnectorEndpointId":{"type":"string","format":"objectId","description":"HTTP Connector Endpoint used to perform the lookup."},"extract":{"type":"string","description":"Path in the lookup response from which to extract the existing record's identifier."}}}}}}},"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}},"responses":{"400-bad-request":{"description":"Bad request. The server could not understand the request because of malformed syntax or invalid parameters.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}},"403-forbidden":{"description":"Forbidden. The authenticated caller does not have permission to perform this operation.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404-not-found":{"description":"Not found. The requested resource does not exist or is not visible to the caller.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422-unprocessable-entity":{"description":"Unprocessable entity. The request was well-formed but was unable to be followed due to semantic errors.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/v1/httpconnectors/{_id}":{"put":{"operationId":"updateHttpConnector","tags":["HTTP Connectors"],"summary":"Update an HTTP connector","description":"Replaces the HTTP Connector with the provided fields.","parameters":[{"in":"path","name":"_id","required":true,"schema":{"type":"string","format":"objectId"},"description":"HTTP Connector ID."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Request"}}}},"responses":{"200":{"description":"HTTP Connector updated successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPConnector"}}}},"400":{"$ref":"#/components/responses/400-bad-request"},"401":{"$ref":"#/components/responses/401-unauthorized"},"403":{"$ref":"#/components/responses/403-forbidden"},"404":{"$ref":"#/components/responses/404-not-found"},"422":{"$ref":"#/components/responses/422-unprocessable-entity"}}}}}}
````

## Delete an HTTP connector

> Permanently deletes an HTTP Connector and all its child resources\
> and endpoints.

```json
{"openapi":"3.2.0","info":{"title":"HTTP Connectors","version":"1.0.0"},"tags":[{"name":"HTTP Connectors","description":"HTTP Connectors define reusable API frameworks — base URIs, versioning\nstrategies, authentication presets, and supported-by rules — that\nHTTP connections, iClients, imports, and exports inherit.\n\nEach connector has one or more versions and may group multiple API\nproducts under `apis[]`. Child resources (HTTP Connector Resources\nand Endpoints) define the specific operations available.\n\nTwo structural patterns exist:\n- **Flat** — versions and baseURIs sit directly on the connector.\n  Most connectors use this pattern.\n- **Grouped** — the connector nests API products under `apis[]`,\n  each with its own versions and baseURIs.\n\n## HTTP connector schema\n\n{% openapi-schemas spec=\"httpconnector\" schemas=\"HTTPConnector\" grouped=\"true\" %}"}],"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"},{"url":"https://api.au.integrator.io","description":"Production (AU region)"},{"url":"https://api.ca.integrator.io","description":"Production (CA region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"responses":{"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}},"403-forbidden":{"description":"Forbidden. The authenticated caller does not have permission to perform this operation.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404-not-found":{"description":"Not found. The requested resource does not exist or is not visible to the caller.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}}},"paths":{"/v1/httpconnectors/{_id}":{"delete":{"operationId":"deleteHttpConnector","tags":["HTTP Connectors"],"summary":"Delete an HTTP connector","description":"Permanently deletes an HTTP Connector and all its child resources\nand endpoints.","parameters":[{"in":"path","name":"_id","required":true,"schema":{"type":"string","format":"objectId"},"description":"HTTP Connector ID."}],"responses":{"204":{"description":"HTTP Connector deleted successfully."},"401":{"$ref":"#/components/responses/401-unauthorized"},"403":{"$ref":"#/components/responses/403-forbidden"},"404":{"$ref":"#/components/responses/404-not-found"}}}}}}
```

## Get form metadata catalog

> Returns projected resource and endpoint summaries for one import or export\
> plane. Import catalogs may include derived \`ignoreExisting\`, \`ignoreMissing\`,\
> and \`isIdentifierPresent\` flags on endpoints. Export catalogs return\
> endpoint \`{ id, name }\` only. Published-only requests may be served from\
> the MongoDB catalog cache and include an \`X-Catalog-Cache\` response header.

```json
{"openapi":"3.2.0","info":{"title":"HTTP Connectors","version":"1.0.0"},"tags":[{"name":"HTTP Connectors","description":"HTTP Connectors define reusable API frameworks — base URIs, versioning\nstrategies, authentication presets, and supported-by rules — that\nHTTP connections, iClients, imports, and exports inherit.\n\nEach connector has one or more versions and may group multiple API\nproducts under `apis[]`. Child resources (HTTP Connector Resources\nand Endpoints) define the specific operations available.\n\nTwo structural patterns exist:\n- **Flat** — versions and baseURIs sit directly on the connector.\n  Most connectors use this pattern.\n- **Grouped** — the connector nests API products under `apis[]`,\n  each with its own versions and baseURIs.\n\n## HTTP connector schema\n\n{% openapi-schemas spec=\"httpconnector\" schemas=\"HTTPConnector\" grouped=\"true\" %}"}],"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"},{"url":"https://api.au.integrator.io","description":"Production (AU region)"},{"url":"https://api.ca.integrator.io","description":"Production (CA region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"HTTPConnectorCatalogResponse":{"type":"object","required":["resources"],"description":"Form metadata catalog for one import or export plane.","properties":{"labels":{"type":"object","additionalProperties":{"type":"string"},"description":"Display labels for catalog UI sections."},"versions":{"type":"array","description":"Connector versions included in the catalog projection.","items":{"type":"object","properties":{"version":{"type":"string","description":"Display name for the version."},"_id":{"type":"string","format":"objectId","description":"Version ID."}}}},"resources":{"type":"array","description":"Projected resources and their endpoints for the requested plane.","items":{"$ref":"#/components/schemas/CatalogResourceSummary"}}}},"CatalogResourceSummary":{"type":"object","required":["id","name","endpoints"],"description":"Projected resource summary in a form metadata catalog response.","properties":{"id":{"type":"string","format":"objectId","description":"HTTP Connector Resource ID."},"name":{"type":"string","description":"Display name for this resource."},"_httpConnectorApiId":{"type":"string","format":"objectId","description":"API group this resource belongs to when the connector uses grouped APIs."},"_versionIds":{"type":"array","description":"Version IDs this resource is associated with.","items":{"type":"string","format":"objectId"}},"versions":{"type":"array","description":"Version labels associated with this resource.","items":{"type":"object","properties":{"version":{"type":"string","description":"Display name for the version."},"_id":{"type":"string","format":"objectId","description":"Version ID."}}}},"endpoints":{"type":"array","description":"Endpoint summaries available on this resource for the requested plane.","items":{"$ref":"#/components/schemas/CatalogEndpointSummary"}}}},"CatalogEndpointSummary":{"type":"object","required":["id","name"],"description":"Projected endpoint summary in a form metadata catalog response.","properties":{"id":{"type":"string","format":"objectId","description":"HTTP Connector Endpoint ID."},"name":{"type":"string","description":"Display name for this endpoint."},"ignoreExisting":{"type":"boolean","description":"When true, import flows ignore records that already exist. Present for import catalogs only."},"ignoreMissing":{"type":"boolean","description":"When true, import flows ignore missing records. Present for import catalogs only."},"isIdentifierPresent":{"type":"boolean","description":"When true, the import endpoint exposes an identifier field. Present for import catalogs only."}}},"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}},"responses":{"400-bad-request":{"description":"Bad request. The server could not understand the request because of malformed syntax or invalid parameters.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}},"404-not-found":{"description":"Not found. The requested resource does not exist or is not visible to the caller.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/v1/httpconnectors/{_id}/catalog":{"get":{"operationId":"getHttpConnectorCatalog","tags":["HTTP Connectors"],"summary":"Get form metadata catalog","description":"Returns projected resource and endpoint summaries for one import or export\nplane. Import catalogs may include derived `ignoreExisting`, `ignoreMissing`,\nand `isIdentifierPresent` flags on endpoints. Export catalogs return\nendpoint `{ id, name }` only. Published-only requests may be served from\nthe MongoDB catalog cache and include an `X-Catalog-Cache` response header.","parameters":[{"in":"path","name":"_id","required":true,"schema":{"type":"string","format":"objectId"},"description":"HTTP Connector ID."},{"name":"resourceType","in":"query","required":true,"schema":{"type":"string","enum":["export","import"]},"description":"Resource plane to project."},{"name":"blob","in":"query","required":true,"schema":{"type":"string","enum":["true","false"]},"description":"Selects the blob or non-blob endpoint plane."},{"name":"api","in":"query","required":false,"schema":{"type":"string","format":"objectId"},"description":"Optional API group scope filter."},{"name":"version","in":"query","required":false,"schema":{"type":"string","format":"objectId"},"description":"Optional version scope filter."},{"name":"publishedOnly","in":"query","required":false,"schema":{"type":"string","enum":["true","false"]},"description":"When `true`, only published documents are returned and eligible requests\nmay be served from the catalog cache."}],"responses":{"200":{"description":"Form metadata catalog retrieved successfully.","headers":{"X-Catalog-Cache":{"description":"Catalog cache status for eligible published-only requests. Absent\nwhen the request is not cache-eligible.","schema":{"type":"string","enum":["hit","miss"]}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPConnectorCatalogResponse"}}}},"400":{"$ref":"#/components/responses/400-bad-request"},"401":{"$ref":"#/components/responses/401-unauthorized"},"404":{"$ref":"#/components/responses/404-not-found"}}}}}}
```

## Get resource and endpoint detail

> Returns scoped \`httpConnectorResource\` and \`httpConnectorEndpoint\`\
> documents for a single export/import endpoint, or a paired import\
> create/update batch. Lookup endpoints may be inlined when they are\
> published and belong to the same connector. \`endpointId\` and\
> \`endpointIds\` are mutually exclusive; \`endpointIds\` is only valid when\
> \`resourceType\` is \`import\` and must contain exactly two comma-separated\
> ObjectIds. Composite \`id1+id2\` values are rejected.

```json
{"openapi":"3.2.0","info":{"title":"HTTP Connectors","version":"1.0.0"},"tags":[{"name":"HTTP Connectors","description":"HTTP Connectors define reusable API frameworks — base URIs, versioning\nstrategies, authentication presets, and supported-by rules — that\nHTTP connections, iClients, imports, and exports inherit.\n\nEach connector has one or more versions and may group multiple API\nproducts under `apis[]`. Child resources (HTTP Connector Resources\nand Endpoints) define the specific operations available.\n\nTwo structural patterns exist:\n- **Flat** — versions and baseURIs sit directly on the connector.\n  Most connectors use this pattern.\n- **Grouped** — the connector nests API products under `apis[]`,\n  each with its own versions and baseURIs.\n\n## HTTP connector schema\n\n{% openapi-schemas spec=\"httpconnector\" schemas=\"HTTPConnector\" grouped=\"true\" %}"}],"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"},{"url":"https://api.au.integrator.io","description":"Production (AU region)"},{"url":"https://api.ca.integrator.io","description":"Production (CA region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"ResourceEndpointDetail":{"type":"object","required":["resolvedResourceId","httpConnectorResource"],"description":"Scoped resource and endpoint metadata for the HTTP connector form.\nSingle-endpoint requests return `resolvedEndpointId` and\n`httpConnectorEndpoint`. Import batch requests (`endpointIds`) return\n`resolvedEndpointIds` and `httpConnectorEndpoints` instead.","properties":{"resolvedResourceId":{"type":"string","format":"objectId","description":"Resource ID resolved for the request."},"resolvedEndpointId":{"type":"string","format":"objectId","description":"Endpoint ID for single-endpoint requests. Present when `resolvedEndpointIds` is absent."},"resolvedEndpointIds":{"type":"array","minItems":2,"maxItems":2,"description":"Create/update endpoint ID pair for import batch requests. Present for batch responses.","items":{"type":"string","format":"objectId"}},"resolvedVersionId":{"type":"string","format":"objectId","description":"Echoed when a version scope filter was supplied on the request."},"httpConnectorResource":{"$ref":"#/components/schemas/HTTPConnectorResourceSummary"},"httpConnectorEndpoint":{"$ref":"#/components/schemas/HTTPConnectorEndpointSummary","description":"Endpoint document for single-endpoint requests. Present when `resolvedEndpointIds` is absent."},"httpConnectorEndpoints":{"type":"array","minItems":2,"maxItems":2,"description":"Create/update endpoint documents for import batch requests. Present for batch responses.","items":{"$ref":"#/components/schemas/HTTPConnectorEndpointSummary"}},"lookupHttpConnectorEndpoint":{"$ref":"#/components/schemas/HTTPConnectorEndpointSummary","description":"Present for import single-endpoint requests when a lookup endpoint\nresolves in scope."},"lookupHttpConnectorEndpoints":{"type":"array","description":"Lookup endpoints resolved for import batch requests.","items":{"$ref":"#/components/schemas/HTTPConnectorEndpointSummary"}}},"if":{"required":["resolvedEndpointIds"]},"then":{"required":["resolvedEndpointIds","httpConnectorEndpoints"]},"else":{"required":["resolvedEndpointId","httpConnectorEndpoint"]}},"HTTPConnectorResourceSummary":{"type":"object","description":"Sanitized HTTP Connector Resource document returned by resourceEndpointDetail.","additionalProperties":true},"HTTPConnectorEndpointSummary":{"type":"object","description":"Sanitized HTTP Connector Endpoint document returned by resourceEndpointDetail.","additionalProperties":true},"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}},"responses":{"400-bad-request":{"description":"Bad request. The server could not understand the request because of malformed syntax or invalid parameters.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}},"404-not-found":{"description":"Not found. The requested resource does not exist or is not visible to the caller.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/v1/httpconnectors/{_id}/resourceEndpointDetail":{"get":{"operationId":"getHttpConnectorResourceEndpointDetail","tags":["HTTP Connectors"],"summary":"Get resource and endpoint detail","description":"Returns scoped `httpConnectorResource` and `httpConnectorEndpoint`\ndocuments for a single export/import endpoint, or a paired import\ncreate/update batch. Lookup endpoints may be inlined when they are\npublished and belong to the same connector. `endpointId` and\n`endpointIds` are mutually exclusive; `endpointIds` is only valid when\n`resourceType` is `import` and must contain exactly two comma-separated\nObjectIds. Composite `id1+id2` values are rejected.","parameters":[{"in":"path","name":"_id","required":true,"schema":{"type":"string","format":"objectId"},"description":"HTTP Connector ID."},{"name":"resourceType","in":"query","required":true,"schema":{"type":"string","enum":["export","import"]},"description":"Resource plane to resolve."},{"name":"resourceId","in":"query","required":true,"schema":{"type":"string","format":"objectId"},"description":"HTTP Connector Resource ID that belongs to this connector."},{"name":"blob","in":"query","required":true,"schema":{"type":"string","enum":["true","false"]},"description":"Selects the blob or non-blob endpoint plane."},{"name":"endpointId","in":"query","required":false,"schema":{"type":"string","format":"objectId"},"description":"Single endpoint ID. Mutually exclusive with `endpointIds`."},{"name":"endpointIds","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated pair of import endpoint IDs for create/update batch\nmode. Import only; exactly two unique IDs. Mutually exclusive with\n`endpointId`."},{"name":"api","in":"query","required":false,"schema":{"type":"string","format":"objectId"},"description":"Optional API group scope filter."},{"name":"version","in":"query","required":false,"schema":{"type":"string","format":"objectId"},"description":"Optional version scope filter; echoed as `resolvedVersionId` when present."},{"name":"publishedOnly","in":"query","required":false,"schema":{"type":"string","enum":["true","false"]},"description":"When `true`, only published documents are returned."}],"responses":{"200":{"description":"Resource and endpoint detail retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceEndpointDetail"}}}},"400":{"$ref":"#/components/responses/400-bad-request"},"401":{"$ref":"#/components/responses/401-unauthorized"},"404":{"$ref":"#/components/responses/404-not-found"}}}}}}
```

## Get form metadata catalog

> Returns projected resource and endpoint summaries for one import or export\
> plane. Import catalogs may include derived \`ignoreExisting\`, \`ignoreMissing\`,\
> and \`isIdentifierPresent\` flags on endpoints. Export catalogs return\
> endpoint \`{ id, name }\` only. Published-only requests may be served from\
> the MongoDB catalog cache and include an \`X-Catalog-Cache\` response header.

```json
{"openapi":"3.2.0","info":{"title":"HTTP Connectors","version":"1.0.0"},"tags":[{"name":"HTTP Connectors","description":"HTTP Connectors define reusable API frameworks — base URIs, versioning\nstrategies, authentication presets, and supported-by rules — that\nHTTP connections, iClients, imports, and exports inherit.\n\nEach connector has one or more versions and may group multiple API\nproducts under `apis[]`. Child resources (HTTP Connector Resources\nand Endpoints) define the specific operations available.\n\nTwo structural patterns exist:\n- **Flat** — versions and baseURIs sit directly on the connector.\n  Most connectors use this pattern.\n- **Grouped** — the connector nests API products under `apis[]`,\n  each with its own versions and baseURIs.\n\n## HTTP connector schema\n\n{% openapi-schemas spec=\"httpconnector\" schemas=\"HTTPConnector\" grouped=\"true\" %}"}],"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"},{"url":"https://api.au.integrator.io","description":"Production (AU region)"},{"url":"https://api.ca.integrator.io","description":"Production (CA region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"HTTPConnectorCatalogResponse":{"type":"object","required":["resources"],"description":"Form metadata catalog for one import or export plane.","properties":{"labels":{"type":"object","additionalProperties":{"type":"string"},"description":"Display labels for catalog UI sections."},"versions":{"type":"array","description":"Connector versions included in the catalog projection.","items":{"type":"object","properties":{"version":{"type":"string","description":"Display name for the version."},"_id":{"type":"string","format":"objectId","description":"Version ID."}}}},"resources":{"type":"array","description":"Projected resources and their endpoints for the requested plane.","items":{"$ref":"#/components/schemas/CatalogResourceSummary"}}}},"CatalogResourceSummary":{"type":"object","required":["id","name","endpoints"],"description":"Projected resource summary in a form metadata catalog response.","properties":{"id":{"type":"string","format":"objectId","description":"HTTP Connector Resource ID."},"name":{"type":"string","description":"Display name for this resource."},"_httpConnectorApiId":{"type":"string","format":"objectId","description":"API group this resource belongs to when the connector uses grouped APIs."},"_versionIds":{"type":"array","description":"Version IDs this resource is associated with.","items":{"type":"string","format":"objectId"}},"versions":{"type":"array","description":"Version labels associated with this resource.","items":{"type":"object","properties":{"version":{"type":"string","description":"Display name for the version."},"_id":{"type":"string","format":"objectId","description":"Version ID."}}}},"endpoints":{"type":"array","description":"Endpoint summaries available on this resource for the requested plane.","items":{"$ref":"#/components/schemas/CatalogEndpointSummary"}}}},"CatalogEndpointSummary":{"type":"object","required":["id","name"],"description":"Projected endpoint summary in a form metadata catalog response.","properties":{"id":{"type":"string","format":"objectId","description":"HTTP Connector Endpoint ID."},"name":{"type":"string","description":"Display name for this endpoint."},"ignoreExisting":{"type":"boolean","description":"When true, import flows ignore records that already exist. Present for import catalogs only."},"ignoreMissing":{"type":"boolean","description":"When true, import flows ignore missing records. Present for import catalogs only."},"isIdentifierPresent":{"type":"boolean","description":"When true, the import endpoint exposes an identifier field. Present for import catalogs only."}}},"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}},"responses":{"400-bad-request":{"description":"Bad request. The server could not understand the request because of malformed syntax or invalid parameters.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}},"404-not-found":{"description":"Not found. The requested resource does not exist or is not visible to the caller.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/api/httpconnectors/{_id}/catalog":{"get":{"operationId":"getHttpConnectorCatalog","tags":["HTTP Connectors"],"summary":"Get form metadata catalog","description":"Returns projected resource and endpoint summaries for one import or export\nplane. Import catalogs may include derived `ignoreExisting`, `ignoreMissing`,\nand `isIdentifierPresent` flags on endpoints. Export catalogs return\nendpoint `{ id, name }` only. Published-only requests may be served from\nthe MongoDB catalog cache and include an `X-Catalog-Cache` response header.","parameters":[{"in":"path","name":"_id","required":true,"schema":{"type":"string","format":"objectId"},"description":"HTTP Connector ID."},{"name":"resourceType","in":"query","required":true,"schema":{"type":"string","enum":["export","import"]},"description":"Resource plane to project."},{"name":"blob","in":"query","required":true,"schema":{"type":"string","enum":["true","false"]},"description":"Selects the blob or non-blob endpoint plane."},{"name":"api","in":"query","required":false,"schema":{"type":"string","format":"objectId"},"description":"Optional API group scope filter."},{"name":"version","in":"query","required":false,"schema":{"type":"string","format":"objectId"},"description":"Optional version scope filter."},{"name":"publishedOnly","in":"query","required":false,"schema":{"type":"string","enum":["true","false"]},"description":"When `true`, only published documents are returned and eligible requests\nmay be served from the catalog cache."}],"responses":{"200":{"description":"Form metadata catalog retrieved successfully.","headers":{"X-Catalog-Cache":{"description":"Catalog cache status for eligible published-only requests. Absent\nwhen the request is not cache-eligible.","schema":{"type":"string","enum":["hit","miss"]}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPConnectorCatalogResponse"}}}},"400":{"$ref":"#/components/responses/400-bad-request"},"401":{"$ref":"#/components/responses/401-unauthorized"},"404":{"$ref":"#/components/responses/404-not-found"}}}}}}
```

## Get resource and endpoint detail

> Returns scoped \`httpConnectorResource\` and \`httpConnectorEndpoint\`\
> documents for a single export/import endpoint, or a paired import\
> create/update batch. Lookup endpoints may be inlined when they are\
> published and belong to the same connector. \`endpointId\` and\
> \`endpointIds\` are mutually exclusive; \`endpointIds\` is only valid when\
> \`resourceType\` is \`import\` and must contain exactly two comma-separated\
> ObjectIds. Composite \`id1+id2\` values are rejected.

```json
{"openapi":"3.2.0","info":{"title":"HTTP Connectors","version":"1.0.0"},"tags":[{"name":"HTTP Connectors","description":"HTTP Connectors define reusable API frameworks — base URIs, versioning\nstrategies, authentication presets, and supported-by rules — that\nHTTP connections, iClients, imports, and exports inherit.\n\nEach connector has one or more versions and may group multiple API\nproducts under `apis[]`. Child resources (HTTP Connector Resources\nand Endpoints) define the specific operations available.\n\nTwo structural patterns exist:\n- **Flat** — versions and baseURIs sit directly on the connector.\n  Most connectors use this pattern.\n- **Grouped** — the connector nests API products under `apis[]`,\n  each with its own versions and baseURIs.\n\n## HTTP connector schema\n\n{% openapi-schemas spec=\"httpconnector\" schemas=\"HTTPConnector\" grouped=\"true\" %}"}],"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"},{"url":"https://api.au.integrator.io","description":"Production (AU region)"},{"url":"https://api.ca.integrator.io","description":"Production (CA region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"ResourceEndpointDetail":{"type":"object","required":["resolvedResourceId","httpConnectorResource"],"description":"Scoped resource and endpoint metadata for the HTTP connector form.\nSingle-endpoint requests return `resolvedEndpointId` and\n`httpConnectorEndpoint`. Import batch requests (`endpointIds`) return\n`resolvedEndpointIds` and `httpConnectorEndpoints` instead.","properties":{"resolvedResourceId":{"type":"string","format":"objectId","description":"Resource ID resolved for the request."},"resolvedEndpointId":{"type":"string","format":"objectId","description":"Endpoint ID for single-endpoint requests. Present when `resolvedEndpointIds` is absent."},"resolvedEndpointIds":{"type":"array","minItems":2,"maxItems":2,"description":"Create/update endpoint ID pair for import batch requests. Present for batch responses.","items":{"type":"string","format":"objectId"}},"resolvedVersionId":{"type":"string","format":"objectId","description":"Echoed when a version scope filter was supplied on the request."},"httpConnectorResource":{"$ref":"#/components/schemas/HTTPConnectorResourceSummary"},"httpConnectorEndpoint":{"$ref":"#/components/schemas/HTTPConnectorEndpointSummary","description":"Endpoint document for single-endpoint requests. Present when `resolvedEndpointIds` is absent."},"httpConnectorEndpoints":{"type":"array","minItems":2,"maxItems":2,"description":"Create/update endpoint documents for import batch requests. Present for batch responses.","items":{"$ref":"#/components/schemas/HTTPConnectorEndpointSummary"}},"lookupHttpConnectorEndpoint":{"$ref":"#/components/schemas/HTTPConnectorEndpointSummary","description":"Present for import single-endpoint requests when a lookup endpoint\nresolves in scope."},"lookupHttpConnectorEndpoints":{"type":"array","description":"Lookup endpoints resolved for import batch requests.","items":{"$ref":"#/components/schemas/HTTPConnectorEndpointSummary"}}},"if":{"required":["resolvedEndpointIds"]},"then":{"required":["resolvedEndpointIds","httpConnectorEndpoints"]},"else":{"required":["resolvedEndpointId","httpConnectorEndpoint"]}},"HTTPConnectorResourceSummary":{"type":"object","description":"Sanitized HTTP Connector Resource document returned by resourceEndpointDetail.","additionalProperties":true},"HTTPConnectorEndpointSummary":{"type":"object","description":"Sanitized HTTP Connector Endpoint document returned by resourceEndpointDetail.","additionalProperties":true},"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}},"responses":{"400-bad-request":{"description":"Bad request. The server could not understand the request because of malformed syntax or invalid parameters.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}},"404-not-found":{"description":"Not found. The requested resource does not exist or is not visible to the caller.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/api/httpconnectors/{_id}/resourceEndpointDetail":{"get":{"operationId":"getHttpConnectorResourceEndpointDetail","tags":["HTTP Connectors"],"summary":"Get resource and endpoint detail","description":"Returns scoped `httpConnectorResource` and `httpConnectorEndpoint`\ndocuments for a single export/import endpoint, or a paired import\ncreate/update batch. Lookup endpoints may be inlined when they are\npublished and belong to the same connector. `endpointId` and\n`endpointIds` are mutually exclusive; `endpointIds` is only valid when\n`resourceType` is `import` and must contain exactly two comma-separated\nObjectIds. Composite `id1+id2` values are rejected.","parameters":[{"in":"path","name":"_id","required":true,"schema":{"type":"string","format":"objectId"},"description":"HTTP Connector ID."},{"name":"resourceType","in":"query","required":true,"schema":{"type":"string","enum":["export","import"]},"description":"Resource plane to resolve."},{"name":"resourceId","in":"query","required":true,"schema":{"type":"string","format":"objectId"},"description":"HTTP Connector Resource ID that belongs to this connector."},{"name":"blob","in":"query","required":true,"schema":{"type":"string","enum":["true","false"]},"description":"Selects the blob or non-blob endpoint plane."},{"name":"endpointId","in":"query","required":false,"schema":{"type":"string","format":"objectId"},"description":"Single endpoint ID. Mutually exclusive with `endpointIds`."},{"name":"endpointIds","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated pair of import endpoint IDs for create/update batch\nmode. Import only; exactly two unique IDs. Mutually exclusive with\n`endpointId`."},{"name":"api","in":"query","required":false,"schema":{"type":"string","format":"objectId"},"description":"Optional API group scope filter."},{"name":"version","in":"query","required":false,"schema":{"type":"string","format":"objectId"},"description":"Optional version scope filter; echoed as `resolvedVersionId` when present."},{"name":"publishedOnly","in":"query","required":false,"schema":{"type":"string","enum":["true","false"]},"description":"When `true`, only published documents are returned."}],"responses":{"200":{"description":"Resource and endpoint detail retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceEndpointDetail"}}}},"400":{"$ref":"#/components/responses/400-bad-request"},"401":{"$ref":"#/components/responses/401-unauthorized"},"404":{"$ref":"#/components/responses/404-not-found"}}}}}}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://developer.celigo.com/api/api-reference/connections-and-http-connectors/http-connectors.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
