> 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},"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"]}}}}
````

## 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},"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"]},"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},"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"]},"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."}],"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},"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"]},"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"}}}}}}
```
