> 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-connector-resources.md).

# HTTP Connector Resources

HTTP Connector Resources are the logical API groupings (for example "Account", "Contact", "Order") inside an HTTP Connector. Each resource belongs to one connector, is available in one or more of its versions, and owns the HTTP Connector Endpoints that define the operations users can build exports and imports on.

Manage your own resources through `/v1/httpconnectorresources` (list, create) and `/v1/httpconnectorresources/{_id}` (get, update, delete). The nested `/v1/httpconnectors/{_httpConnectorId}/...` routes are read-only views scoped to one connector that also reach resources published by other partners; a resource read through either route is the same object.

### HTTP connector resource schema

## The HTTPConnectorResource object

````json
{"openapi":"3.2.0","info":{"title":"HTTP Connector Resources","version":"1.0.0"},"components":{"schemas":{"HTTPConnectorResource":{"type":"object","required":["_id","_httpConnectorId","name","published","createdAt","lastModified"],"description":"HTTP Connector Resource as returned by `GET /v1/httpconnectorresources`,\n`GET /v1/httpconnectorresources/{_id}`, and the nested\n`GET /v1/httpconnectors/{_httpConnectorId}/{_id}` — all three return the\nsame object. Optional fields that were never set are absent.","allOf":[{"$ref":"#/components/schemas/HTTPConnectorResourceBase"},{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for the resource. Doubles as the\n`_httpConnectorResourceId` path parameter of the HTTP Connector\nEndpoints API."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was created."},"lastModified":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was last updated. Changes on every PUT."}}}]},"HTTPConnectorResourceBase":{"type":"object","description":"Writable fields shared by the request and response schemas.","properties":{"name":{"type":"string","description":"Human-readable name of the API resource this grouping represents (for example \"Account\", \"Contact\", \"Order\")."},"published":{"type":"boolean","default":false,"description":"When true, the resource is visible to users of the connector's\npublished catalog. Only resources whose owner may publish HTTP\nconnectors appear to other accounts."},"_httpConnectorId":{"type":"string","format":"objectId","description":"HTTP Connector this resource belongs to. Must be a connector owned by\nthe caller's account."},"_httpConnectorApiId":{"type":"string","format":"objectId","description":"API group (an entry of the connector's `apis[]`) this resource belongs\nto. Set only for grouped connectors; flat connectors scope resources by\n`_versionIds` instead."},"_versionIds":{"type":"array","description":"Connector (or API group) versions this resource is available in. Each\nid must be one of the connector's `versions[]._id` values.","items":{"type":"string","format":"objectId"}},"_parentResourceId":{"type":"string","format":"objectId","description":"Parent resource when this resource is nested under another one (for\nexample \"Order line\" under \"Order\"). Omit for top-level resources;\ncannot be combined with `isRoot: true`."},"isRoot":{"type":"boolean","default":false,"description":"When true, marks the resource as the root of a resource hierarchy.\nRejected together with `_parentResourceId`."},"metadata":{"type":"object","additionalProperties":true,"description":"Free-form metadata stored with the resource, for example Data Intelligence attributes."},"resourceFields":{"type":"array","description":"Field catalog of the records this resource returns, used by tooling to\ndescribe the API's payloads. Fields nest through their own\n`resourceFields`.","items":{"$ref":"#/components/schemas/ResourceField"}},"supportedBy":{"$ref":"#/components/schemas/ResourceSupportedBy"}}},"ResourceField":{"type":"object","description":"One field of the resource's records, optionally with nested child fields.","required":["id"],"properties":{"id":{"type":"string","description":"Field identifier as it appears in the record."},"label":{"type":"string","description":"Display label for the field."},"description":{"type":"string","description":"Help text describing the field."},"dataType":{"type":"string","description":"Data type label for the field, stored as given."},"metadata":{"type":"object","additionalProperties":true,"description":"Free-form metadata for the field."},"resourceFields":{"type":"array","description":"Child fields of an object or array field. Absent when the field is scalar.","items":{"type":"object","additionalProperties":true,"description":"Nested field with the same shape as its parent."}}}},"ResourceSupportedBy":{"type":"object","description":"Defaults the connector framework applies when a user builds an export or\nan import on one of this resource's endpoints. Each section\npre-configures fields, lists the fields the user must still fill in, and\nclears fields that do not apply.","properties":{"export":{"$ref":"#/components/schemas/ResourceSupportedBySection"},"import":{"allOf":[{"$ref":"#/components/schemas/ResourceSupportedBySection"},{"type":"object","properties":{"pathParameterToIdentifyExisting":{"type":"string","description":"Path parameter whose value identifies the existing record on\nan update or upsert import. Needed only when the endpoint has\nmore than one path parameter."},"lookupToIdentifyExisting":{"type":"object","description":"Lookup the import runs to find out whether a record already\nexists before deciding between create and update. Both\nfields go together — sending one without the other is\nrejected.","properties":{"_httpConnectorEndpointId":{"type":"string","format":"objectId","description":"HTTP Connector Endpoint that performs the lookup. Must be\nan existing endpoint."},"extract":{"type":"string","description":"Path in the lookup response to read the existing record's identifier from."}}}}}]}}},"ResourceSupportedBySection":{"type":"object","description":"Conditions, pre-configured field values, required user inputs, and\nfields to clear for one resource type (export or import) created from\nthis resource.","properties":{"conditions":{"type":"array","description":"Expression-based filters referenced by `_conditionIds` in\n`preConfiguredFields` and `fieldsUserMustSet` to apply those entries\nconditionally.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Identifier of this condition, referenced by `_conditionIds` in field entries."},"condition":{"$ref":"#/components/schemas/Filter"}}}},"preConfiguredFields":{"type":"array","description":"Fields set automatically on the generated export or import. Not editable by the user.","items":{"type":"object","properties":{"path":{"type":"string","description":"Dot-notation name of the setting in the connector's form. It is not always a literal\npath on the generated export or import: a form group such as `response` takes an\nobject value (`{resourcePath: \"customers\"}`) that sets the step's\n`http.response.resourcePath`."},"values":{"type":"array","description":"Value(s) to assign. Typically a single-element array; entries may be any JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this entry to apply. Always applies when absent.","items":{"type":"string","format":"objectId"}}}}},"fieldsUserMustSet":{"type":"array","description":"Fields the user must provide values for on the generated export or import.","items":{"type":"object","properties":{"path":{"type":"string","description":"Dot-notation name of the setting the connector's form asks for: a step field such as\n`ignoreExisting` or `type`, or `mapping.fields.generate.<field>`, a destination field\nthe import's mapping must produce."},"values":{"type":"array","description":"Optional suggested or constrained values. Entries may be any JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this entry to apply.","items":{"type":"string","format":"objectId"}},"helpURL":{"type":"string","description":"URL to documentation for this field."},"labelOverride":{"type":"string","description":"Custom label shown in the UI instead of the default."}}}},"fieldsToUnset":{"type":"array","description":"Dot-notation paths to clear on the generated export or import.","items":{"type":"string"}}}},"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"}}}}}}}}
````

## List your HTTP Connector Resources

> Returns the full HTTP Connector Resources owned by the account, across all\
> of its connectors, sorted by name. This is the canonical CRUD listing; to\
> browse the resources of one connector — including resources published by\
> other partners — use the scoped\
> \`GET /v1/httpconnectors/{\_httpConnectorId}/httpconnectorresources\`, which\
> returns an abridged shape.

````json
{"openapi":"3.2.0","info":{"title":"HTTP Connector Resources","version":"1.0.0"},"tags":[{"name":"HTTP Connector Resources","description":"HTTP Connector Resources are the logical API groupings (for example\n\"Account\", \"Contact\", \"Order\") inside an HTTP Connector. Each resource\nbelongs to one connector, is available in one or more of its versions,\nand owns the HTTP Connector Endpoints that define the operations users\ncan build exports and imports on.\n\nManage your own resources through `/v1/httpconnectorresources`\n(list, create) and `/v1/httpconnectorresources/{_id}` (get, update,\ndelete). The nested `/v1/httpconnectors/{_httpConnectorId}/...` routes\nare read-only views scoped to one connector that also reach resources\npublished by other partners; a resource read through either route is\nthe same object.\n\n## HTTP connector resource schema\n\n{% openapi-schemas spec=\"httpconnectorresource\" schemas=\"HTTPConnectorResource\" 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"}},"parameters":{"After":{"name":"after","in":"query","required":false,"description":"Opaque cursor for forward pagination. Pass the value from the `Link`\nresponse header (`rel=\"next\"`) to fetch the next page.","schema":{"type":"string"}}},"schemas":{"HTTPConnectorResource":{"type":"object","required":["_id","_httpConnectorId","name","published","createdAt","lastModified"],"description":"HTTP Connector Resource as returned by `GET /v1/httpconnectorresources`,\n`GET /v1/httpconnectorresources/{_id}`, and the nested\n`GET /v1/httpconnectors/{_httpConnectorId}/{_id}` — all three return the\nsame object. Optional fields that were never set are absent.","allOf":[{"$ref":"#/components/schemas/HTTPConnectorResourceBase"},{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for the resource. Doubles as the\n`_httpConnectorResourceId` path parameter of the HTTP Connector\nEndpoints API."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was created."},"lastModified":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was last updated. Changes on every PUT."}}}]},"HTTPConnectorResourceBase":{"type":"object","description":"Writable fields shared by the request and response schemas.","properties":{"name":{"type":"string","description":"Human-readable name of the API resource this grouping represents (for example \"Account\", \"Contact\", \"Order\")."},"published":{"type":"boolean","default":false,"description":"When true, the resource is visible to users of the connector's\npublished catalog. Only resources whose owner may publish HTTP\nconnectors appear to other accounts."},"_httpConnectorId":{"type":"string","format":"objectId","description":"HTTP Connector this resource belongs to. Must be a connector owned by\nthe caller's account."},"_httpConnectorApiId":{"type":"string","format":"objectId","description":"API group (an entry of the connector's `apis[]`) this resource belongs\nto. Set only for grouped connectors; flat connectors scope resources by\n`_versionIds` instead."},"_versionIds":{"type":"array","description":"Connector (or API group) versions this resource is available in. Each\nid must be one of the connector's `versions[]._id` values.","items":{"type":"string","format":"objectId"}},"_parentResourceId":{"type":"string","format":"objectId","description":"Parent resource when this resource is nested under another one (for\nexample \"Order line\" under \"Order\"). Omit for top-level resources;\ncannot be combined with `isRoot: true`."},"isRoot":{"type":"boolean","default":false,"description":"When true, marks the resource as the root of a resource hierarchy.\nRejected together with `_parentResourceId`."},"metadata":{"type":"object","additionalProperties":true,"description":"Free-form metadata stored with the resource, for example Data Intelligence attributes."},"resourceFields":{"type":"array","description":"Field catalog of the records this resource returns, used by tooling to\ndescribe the API's payloads. Fields nest through their own\n`resourceFields`.","items":{"$ref":"#/components/schemas/ResourceField"}},"supportedBy":{"$ref":"#/components/schemas/ResourceSupportedBy"}}},"ResourceField":{"type":"object","description":"One field of the resource's records, optionally with nested child fields.","required":["id"],"properties":{"id":{"type":"string","description":"Field identifier as it appears in the record."},"label":{"type":"string","description":"Display label for the field."},"description":{"type":"string","description":"Help text describing the field."},"dataType":{"type":"string","description":"Data type label for the field, stored as given."},"metadata":{"type":"object","additionalProperties":true,"description":"Free-form metadata for the field."},"resourceFields":{"type":"array","description":"Child fields of an object or array field. Absent when the field is scalar.","items":{"type":"object","additionalProperties":true,"description":"Nested field with the same shape as its parent."}}}},"ResourceSupportedBy":{"type":"object","description":"Defaults the connector framework applies when a user builds an export or\nan import on one of this resource's endpoints. Each section\npre-configures fields, lists the fields the user must still fill in, and\nclears fields that do not apply.","properties":{"export":{"$ref":"#/components/schemas/ResourceSupportedBySection"},"import":{"allOf":[{"$ref":"#/components/schemas/ResourceSupportedBySection"},{"type":"object","properties":{"pathParameterToIdentifyExisting":{"type":"string","description":"Path parameter whose value identifies the existing record on\nan update or upsert import. Needed only when the endpoint has\nmore than one path parameter."},"lookupToIdentifyExisting":{"type":"object","description":"Lookup the import runs to find out whether a record already\nexists before deciding between create and update. Both\nfields go together — sending one without the other is\nrejected.","properties":{"_httpConnectorEndpointId":{"type":"string","format":"objectId","description":"HTTP Connector Endpoint that performs the lookup. Must be\nan existing endpoint."},"extract":{"type":"string","description":"Path in the lookup response to read the existing record's identifier from."}}}}}]}}},"ResourceSupportedBySection":{"type":"object","description":"Conditions, pre-configured field values, required user inputs, and\nfields to clear for one resource type (export or import) created from\nthis resource.","properties":{"conditions":{"type":"array","description":"Expression-based filters referenced by `_conditionIds` in\n`preConfiguredFields` and `fieldsUserMustSet` to apply those entries\nconditionally.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Identifier of this condition, referenced by `_conditionIds` in field entries."},"condition":{"$ref":"#/components/schemas/Filter"}}}},"preConfiguredFields":{"type":"array","description":"Fields set automatically on the generated export or import. Not editable by the user.","items":{"type":"object","properties":{"path":{"type":"string","description":"Dot-notation name of the setting in the connector's form. It is not always a literal\npath on the generated export or import: a form group such as `response` takes an\nobject value (`{resourcePath: \"customers\"}`) that sets the step's\n`http.response.resourcePath`."},"values":{"type":"array","description":"Value(s) to assign. Typically a single-element array; entries may be any JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this entry to apply. Always applies when absent.","items":{"type":"string","format":"objectId"}}}}},"fieldsUserMustSet":{"type":"array","description":"Fields the user must provide values for on the generated export or import.","items":{"type":"object","properties":{"path":{"type":"string","description":"Dot-notation name of the setting the connector's form asks for: a step field such as\n`ignoreExisting` or `type`, or `mapping.fields.generate.<field>`, a destination field\nthe import's mapping must produce."},"values":{"type":"array","description":"Optional suggested or constrained values. Entries may be any JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this entry to apply.","items":{"type":"string","format":"objectId"}},"helpURL":{"type":"string","description":"URL to documentation for this field."},"labelOverride":{"type":"string","description":"Custom label shown in the UI instead of the default."}}}},"fieldsToUnset":{"type":"array","description":"Dot-notation paths to clear on the generated export or import.","items":{"type":"string"}}}},"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"}}}}},"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"}}}}}},"paths":{"/v1/httpconnectorresources":{"get":{"operationId":"listOwnHttpConnectorResources","tags":["HTTP Connector Resources"],"summary":"List your HTTP Connector Resources","description":"Returns the full HTTP Connector Resources owned by the account, across all\nof its connectors, sorted by name. This is the canonical CRUD listing; to\nbrowse the resources of one connector — including resources published by\nother partners — use the scoped\n`GET /v1/httpconnectors/{_httpConnectorId}/httpconnectorresources`, which\nreturns an abridged shape.","parameters":[{"name":"limit","in":"query","description":"Maximum number of records to return per page.","schema":{"type":"integer","minimum":1}},{"$ref":"#/components/parameters/After"}],"responses":{"200":{"description":"Array of the account's HTTP Connector Resources.","headers":{"Link":{"description":"RFC-5988 pagination links. When more pages remain, includes a\n`<...>; rel=\"next\"` entry; absent on the final page.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HTTPConnectorResource"}}}}},"204":{"description":"The account owns no HTTP Connector Resources."},"401":{"$ref":"#/components/responses/401-unauthorized"},"403":{"$ref":"#/components/responses/403-forbidden"}}}}}}
````

## Create an HTTP Connector Resource

> Creates a resource grouping under one of your HTTP Connectors. Create the\
> connector first (\`POST /v1/httpconnectors\`) and pass its id as\
> \`\_httpConnectorId\`; list the connector's \`versions\[].\_id\` values in\
> \`\_versionIds\` to make the resource available in those versions. Endpoints\
> are then attached to the resource through\
> \`POST /v1/httpconnectorendpoints\`.

````json
{"openapi":"3.2.0","info":{"title":"HTTP Connector Resources","version":"1.0.0"},"tags":[{"name":"HTTP Connector Resources","description":"HTTP Connector Resources are the logical API groupings (for example\n\"Account\", \"Contact\", \"Order\") inside an HTTP Connector. Each resource\nbelongs to one connector, is available in one or more of its versions,\nand owns the HTTP Connector Endpoints that define the operations users\ncan build exports and imports on.\n\nManage your own resources through `/v1/httpconnectorresources`\n(list, create) and `/v1/httpconnectorresources/{_id}` (get, update,\ndelete). The nested `/v1/httpconnectors/{_httpConnectorId}/...` routes\nare read-only views scoped to one connector that also reach resources\npublished by other partners; a resource read through either route is\nthe same object.\n\n## HTTP connector resource schema\n\n{% openapi-schemas spec=\"httpconnectorresource\" schemas=\"HTTPConnectorResource\" 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 Resource through\n`POST /v1/httpconnectorresources` and `PUT /v1/httpconnectorresources/{_id}`.\nPUT replaces the whole document — omitted optional fields are cleared,\nexcept `published` and `isRoot`, which keep their stored values.","required":["name","_httpConnectorId"],"allOf":[{"$ref":"#/components/schemas/HTTPConnectorResourceBase"}]},"HTTPConnectorResourceBase":{"type":"object","description":"Writable fields shared by the request and response schemas.","properties":{"name":{"type":"string","description":"Human-readable name of the API resource this grouping represents (for example \"Account\", \"Contact\", \"Order\")."},"published":{"type":"boolean","default":false,"description":"When true, the resource is visible to users of the connector's\npublished catalog. Only resources whose owner may publish HTTP\nconnectors appear to other accounts."},"_httpConnectorId":{"type":"string","format":"objectId","description":"HTTP Connector this resource belongs to. Must be a connector owned by\nthe caller's account."},"_httpConnectorApiId":{"type":"string","format":"objectId","description":"API group (an entry of the connector's `apis[]`) this resource belongs\nto. Set only for grouped connectors; flat connectors scope resources by\n`_versionIds` instead."},"_versionIds":{"type":"array","description":"Connector (or API group) versions this resource is available in. Each\nid must be one of the connector's `versions[]._id` values.","items":{"type":"string","format":"objectId"}},"_parentResourceId":{"type":"string","format":"objectId","description":"Parent resource when this resource is nested under another one (for\nexample \"Order line\" under \"Order\"). Omit for top-level resources;\ncannot be combined with `isRoot: true`."},"isRoot":{"type":"boolean","default":false,"description":"When true, marks the resource as the root of a resource hierarchy.\nRejected together with `_parentResourceId`."},"metadata":{"type":"object","additionalProperties":true,"description":"Free-form metadata stored with the resource, for example Data Intelligence attributes."},"resourceFields":{"type":"array","description":"Field catalog of the records this resource returns, used by tooling to\ndescribe the API's payloads. Fields nest through their own\n`resourceFields`.","items":{"$ref":"#/components/schemas/ResourceField"}},"supportedBy":{"$ref":"#/components/schemas/ResourceSupportedBy"}}},"ResourceField":{"type":"object","description":"One field of the resource's records, optionally with nested child fields.","required":["id"],"properties":{"id":{"type":"string","description":"Field identifier as it appears in the record."},"label":{"type":"string","description":"Display label for the field."},"description":{"type":"string","description":"Help text describing the field."},"dataType":{"type":"string","description":"Data type label for the field, stored as given."},"metadata":{"type":"object","additionalProperties":true,"description":"Free-form metadata for the field."},"resourceFields":{"type":"array","description":"Child fields of an object or array field. Absent when the field is scalar.","items":{"type":"object","additionalProperties":true,"description":"Nested field with the same shape as its parent."}}}},"ResourceSupportedBy":{"type":"object","description":"Defaults the connector framework applies when a user builds an export or\nan import on one of this resource's endpoints. Each section\npre-configures fields, lists the fields the user must still fill in, and\nclears fields that do not apply.","properties":{"export":{"$ref":"#/components/schemas/ResourceSupportedBySection"},"import":{"allOf":[{"$ref":"#/components/schemas/ResourceSupportedBySection"},{"type":"object","properties":{"pathParameterToIdentifyExisting":{"type":"string","description":"Path parameter whose value identifies the existing record on\nan update or upsert import. Needed only when the endpoint has\nmore than one path parameter."},"lookupToIdentifyExisting":{"type":"object","description":"Lookup the import runs to find out whether a record already\nexists before deciding between create and update. Both\nfields go together — sending one without the other is\nrejected.","properties":{"_httpConnectorEndpointId":{"type":"string","format":"objectId","description":"HTTP Connector Endpoint that performs the lookup. Must be\nan existing endpoint."},"extract":{"type":"string","description":"Path in the lookup response to read the existing record's identifier from."}}}}}]}}},"ResourceSupportedBySection":{"type":"object","description":"Conditions, pre-configured field values, required user inputs, and\nfields to clear for one resource type (export or import) created from\nthis resource.","properties":{"conditions":{"type":"array","description":"Expression-based filters referenced by `_conditionIds` in\n`preConfiguredFields` and `fieldsUserMustSet` to apply those entries\nconditionally.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Identifier of this condition, referenced by `_conditionIds` in field entries."},"condition":{"$ref":"#/components/schemas/Filter"}}}},"preConfiguredFields":{"type":"array","description":"Fields set automatically on the generated export or import. Not editable by the user.","items":{"type":"object","properties":{"path":{"type":"string","description":"Dot-notation name of the setting in the connector's form. It is not always a literal\npath on the generated export or import: a form group such as `response` takes an\nobject value (`{resourcePath: \"customers\"}`) that sets the step's\n`http.response.resourcePath`."},"values":{"type":"array","description":"Value(s) to assign. Typically a single-element array; entries may be any JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this entry to apply. Always applies when absent.","items":{"type":"string","format":"objectId"}}}}},"fieldsUserMustSet":{"type":"array","description":"Fields the user must provide values for on the generated export or import.","items":{"type":"object","properties":{"path":{"type":"string","description":"Dot-notation name of the setting the connector's form asks for: a step field such as\n`ignoreExisting` or `type`, or `mapping.fields.generate.<field>`, a destination field\nthe import's mapping must produce."},"values":{"type":"array","description":"Optional suggested or constrained values. Entries may be any JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this entry to apply.","items":{"type":"string","format":"objectId"}},"helpURL":{"type":"string","description":"URL to documentation for this field."},"labelOverride":{"type":"string","description":"Custom label shown in the UI instead of the default."}}}},"fieldsToUnset":{"type":"array","description":"Dot-notation paths to clear on the generated export or import.","items":{"type":"string"}}}},"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"}}}}},"HTTPConnectorResource":{"type":"object","required":["_id","_httpConnectorId","name","published","createdAt","lastModified"],"description":"HTTP Connector Resource as returned by `GET /v1/httpconnectorresources`,\n`GET /v1/httpconnectorresources/{_id}`, and the nested\n`GET /v1/httpconnectors/{_httpConnectorId}/{_id}` — all three return the\nsame object. Optional fields that were never set are absent.","allOf":[{"$ref":"#/components/schemas/HTTPConnectorResourceBase"},{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for the resource. Doubles as the\n`_httpConnectorResourceId` path parameter of the HTTP Connector\nEndpoints API."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was created."},"lastModified":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was last updated. Changes on every PUT."}}}]},"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"}}}}}},"paths":{"/v1/httpconnectorresources":{"post":{"operationId":"createHttpConnectorResource","tags":["HTTP Connector Resources"],"summary":"Create an HTTP Connector Resource","description":"Creates a resource grouping under one of your HTTP Connectors. Create the\nconnector first (`POST /v1/httpconnectors`) and pass its id as\n`_httpConnectorId`; list the connector's `versions[]._id` values in\n`_versionIds` to make the resource available in those versions. Endpoints\nare then attached to the resource through\n`POST /v1/httpconnectorendpoints`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Request"}}}},"responses":{"201":{"description":"Created resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPConnectorResource"}}}},"400":{"$ref":"#/components/responses/400-bad-request"},"401":{"$ref":"#/components/responses/401-unauthorized"},"403":{"$ref":"#/components/responses/403-forbidden"},"422":{"description":"A required field is missing, a referenced connector or version is not\nyours or does not exist, or `isRoot` and `_parentResourceId` were sent\ntogether.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Get one of your HTTP Connector Resources

> Returns the full resource. The nested\
> \`GET /v1/httpconnectors/{\_httpConnectorId}/{\_id}\` returns the identical\
> object and additionally reaches resources published by other partners;\
> this route is limited to resources the account owns.

````json
{"openapi":"3.2.0","info":{"title":"HTTP Connector Resources","version":"1.0.0"},"tags":[{"name":"HTTP Connector Resources","description":"HTTP Connector Resources are the logical API groupings (for example\n\"Account\", \"Contact\", \"Order\") inside an HTTP Connector. Each resource\nbelongs to one connector, is available in one or more of its versions,\nand owns the HTTP Connector Endpoints that define the operations users\ncan build exports and imports on.\n\nManage your own resources through `/v1/httpconnectorresources`\n(list, create) and `/v1/httpconnectorresources/{_id}` (get, update,\ndelete). The nested `/v1/httpconnectors/{_httpConnectorId}/...` routes\nare read-only views scoped to one connector that also reach resources\npublished by other partners; a resource read through either route is\nthe same object.\n\n## HTTP connector resource schema\n\n{% openapi-schemas spec=\"httpconnectorresource\" schemas=\"HTTPConnectorResource\" 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":{"HTTPConnectorResource":{"type":"object","required":["_id","_httpConnectorId","name","published","createdAt","lastModified"],"description":"HTTP Connector Resource as returned by `GET /v1/httpconnectorresources`,\n`GET /v1/httpconnectorresources/{_id}`, and the nested\n`GET /v1/httpconnectors/{_httpConnectorId}/{_id}` — all three return the\nsame object. Optional fields that were never set are absent.","allOf":[{"$ref":"#/components/schemas/HTTPConnectorResourceBase"},{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for the resource. Doubles as the\n`_httpConnectorResourceId` path parameter of the HTTP Connector\nEndpoints API."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was created."},"lastModified":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was last updated. Changes on every PUT."}}}]},"HTTPConnectorResourceBase":{"type":"object","description":"Writable fields shared by the request and response schemas.","properties":{"name":{"type":"string","description":"Human-readable name of the API resource this grouping represents (for example \"Account\", \"Contact\", \"Order\")."},"published":{"type":"boolean","default":false,"description":"When true, the resource is visible to users of the connector's\npublished catalog. Only resources whose owner may publish HTTP\nconnectors appear to other accounts."},"_httpConnectorId":{"type":"string","format":"objectId","description":"HTTP Connector this resource belongs to. Must be a connector owned by\nthe caller's account."},"_httpConnectorApiId":{"type":"string","format":"objectId","description":"API group (an entry of the connector's `apis[]`) this resource belongs\nto. Set only for grouped connectors; flat connectors scope resources by\n`_versionIds` instead."},"_versionIds":{"type":"array","description":"Connector (or API group) versions this resource is available in. Each\nid must be one of the connector's `versions[]._id` values.","items":{"type":"string","format":"objectId"}},"_parentResourceId":{"type":"string","format":"objectId","description":"Parent resource when this resource is nested under another one (for\nexample \"Order line\" under \"Order\"). Omit for top-level resources;\ncannot be combined with `isRoot: true`."},"isRoot":{"type":"boolean","default":false,"description":"When true, marks the resource as the root of a resource hierarchy.\nRejected together with `_parentResourceId`."},"metadata":{"type":"object","additionalProperties":true,"description":"Free-form metadata stored with the resource, for example Data Intelligence attributes."},"resourceFields":{"type":"array","description":"Field catalog of the records this resource returns, used by tooling to\ndescribe the API's payloads. Fields nest through their own\n`resourceFields`.","items":{"$ref":"#/components/schemas/ResourceField"}},"supportedBy":{"$ref":"#/components/schemas/ResourceSupportedBy"}}},"ResourceField":{"type":"object","description":"One field of the resource's records, optionally with nested child fields.","required":["id"],"properties":{"id":{"type":"string","description":"Field identifier as it appears in the record."},"label":{"type":"string","description":"Display label for the field."},"description":{"type":"string","description":"Help text describing the field."},"dataType":{"type":"string","description":"Data type label for the field, stored as given."},"metadata":{"type":"object","additionalProperties":true,"description":"Free-form metadata for the field."},"resourceFields":{"type":"array","description":"Child fields of an object or array field. Absent when the field is scalar.","items":{"type":"object","additionalProperties":true,"description":"Nested field with the same shape as its parent."}}}},"ResourceSupportedBy":{"type":"object","description":"Defaults the connector framework applies when a user builds an export or\nan import on one of this resource's endpoints. Each section\npre-configures fields, lists the fields the user must still fill in, and\nclears fields that do not apply.","properties":{"export":{"$ref":"#/components/schemas/ResourceSupportedBySection"},"import":{"allOf":[{"$ref":"#/components/schemas/ResourceSupportedBySection"},{"type":"object","properties":{"pathParameterToIdentifyExisting":{"type":"string","description":"Path parameter whose value identifies the existing record on\nan update or upsert import. Needed only when the endpoint has\nmore than one path parameter."},"lookupToIdentifyExisting":{"type":"object","description":"Lookup the import runs to find out whether a record already\nexists before deciding between create and update. Both\nfields go together — sending one without the other is\nrejected.","properties":{"_httpConnectorEndpointId":{"type":"string","format":"objectId","description":"HTTP Connector Endpoint that performs the lookup. Must be\nan existing endpoint."},"extract":{"type":"string","description":"Path in the lookup response to read the existing record's identifier from."}}}}}]}}},"ResourceSupportedBySection":{"type":"object","description":"Conditions, pre-configured field values, required user inputs, and\nfields to clear for one resource type (export or import) created from\nthis resource.","properties":{"conditions":{"type":"array","description":"Expression-based filters referenced by `_conditionIds` in\n`preConfiguredFields` and `fieldsUserMustSet` to apply those entries\nconditionally.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Identifier of this condition, referenced by `_conditionIds` in field entries."},"condition":{"$ref":"#/components/schemas/Filter"}}}},"preConfiguredFields":{"type":"array","description":"Fields set automatically on the generated export or import. Not editable by the user.","items":{"type":"object","properties":{"path":{"type":"string","description":"Dot-notation name of the setting in the connector's form. It is not always a literal\npath on the generated export or import: a form group such as `response` takes an\nobject value (`{resourcePath: \"customers\"}`) that sets the step's\n`http.response.resourcePath`."},"values":{"type":"array","description":"Value(s) to assign. Typically a single-element array; entries may be any JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this entry to apply. Always applies when absent.","items":{"type":"string","format":"objectId"}}}}},"fieldsUserMustSet":{"type":"array","description":"Fields the user must provide values for on the generated export or import.","items":{"type":"object","properties":{"path":{"type":"string","description":"Dot-notation name of the setting the connector's form asks for: a step field such as\n`ignoreExisting` or `type`, or `mapping.fields.generate.<field>`, a destination field\nthe import's mapping must produce."},"values":{"type":"array","description":"Optional suggested or constrained values. Entries may be any JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this entry to apply.","items":{"type":"string","format":"objectId"}},"helpURL":{"type":"string","description":"URL to documentation for this field."},"labelOverride":{"type":"string","description":"Custom label shown in the UI instead of the default."}}}},"fieldsToUnset":{"type":"array","description":"Dot-notation paths to clear on the generated export or import.","items":{"type":"string"}}}},"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"}}}}},"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"}}}}}},"paths":{"/v1/httpconnectorresources/{_id}":{"get":{"operationId":"getOwnHttpConnectorResourceById","tags":["HTTP Connector Resources"],"summary":"Get one of your HTTP Connector Resources","description":"Returns the full resource. The nested\n`GET /v1/httpconnectors/{_httpConnectorId}/{_id}` returns the identical\nobject and additionally reaches resources published by other partners;\nthis route is limited to resources the account owns.","parameters":[{"in":"path","name":"_id","required":true,"schema":{"type":"string","format":"objectId"},"description":"HTTP Connector Resource ID."}],"responses":{"200":{"description":"The resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPConnectorResource"}}}},"401":{"$ref":"#/components/responses/401-unauthorized"},"403":{"$ref":"#/components/responses/403-forbidden"},"404":{"description":"No resource with this id is owned by the account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Update an HTTP Connector Resource

> Replaces the resource with the request body. Send the complete document —\
> \`\_versionIds\`, \`metadata\`, \`resourceFields\`, \`supportedBy\`, and the other\
> optional fields are cleared when left out, while \`published\` and \`isRoot\`\
> keep their stored values when omitted. \`name\` and \`\_httpConnectorId\` are\
> required on every PUT. Publish a resource by sending \`published: true\`.

````json
{"openapi":"3.2.0","info":{"title":"HTTP Connector Resources","version":"1.0.0"},"tags":[{"name":"HTTP Connector Resources","description":"HTTP Connector Resources are the logical API groupings (for example\n\"Account\", \"Contact\", \"Order\") inside an HTTP Connector. Each resource\nbelongs to one connector, is available in one or more of its versions,\nand owns the HTTP Connector Endpoints that define the operations users\ncan build exports and imports on.\n\nManage your own resources through `/v1/httpconnectorresources`\n(list, create) and `/v1/httpconnectorresources/{_id}` (get, update,\ndelete). The nested `/v1/httpconnectors/{_httpConnectorId}/...` routes\nare read-only views scoped to one connector that also reach resources\npublished by other partners; a resource read through either route is\nthe same object.\n\n## HTTP connector resource schema\n\n{% openapi-schemas spec=\"httpconnectorresource\" schemas=\"HTTPConnectorResource\" 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 Resource through\n`POST /v1/httpconnectorresources` and `PUT /v1/httpconnectorresources/{_id}`.\nPUT replaces the whole document — omitted optional fields are cleared,\nexcept `published` and `isRoot`, which keep their stored values.","required":["name","_httpConnectorId"],"allOf":[{"$ref":"#/components/schemas/HTTPConnectorResourceBase"}]},"HTTPConnectorResourceBase":{"type":"object","description":"Writable fields shared by the request and response schemas.","properties":{"name":{"type":"string","description":"Human-readable name of the API resource this grouping represents (for example \"Account\", \"Contact\", \"Order\")."},"published":{"type":"boolean","default":false,"description":"When true, the resource is visible to users of the connector's\npublished catalog. Only resources whose owner may publish HTTP\nconnectors appear to other accounts."},"_httpConnectorId":{"type":"string","format":"objectId","description":"HTTP Connector this resource belongs to. Must be a connector owned by\nthe caller's account."},"_httpConnectorApiId":{"type":"string","format":"objectId","description":"API group (an entry of the connector's `apis[]`) this resource belongs\nto. Set only for grouped connectors; flat connectors scope resources by\n`_versionIds` instead."},"_versionIds":{"type":"array","description":"Connector (or API group) versions this resource is available in. Each\nid must be one of the connector's `versions[]._id` values.","items":{"type":"string","format":"objectId"}},"_parentResourceId":{"type":"string","format":"objectId","description":"Parent resource when this resource is nested under another one (for\nexample \"Order line\" under \"Order\"). Omit for top-level resources;\ncannot be combined with `isRoot: true`."},"isRoot":{"type":"boolean","default":false,"description":"When true, marks the resource as the root of a resource hierarchy.\nRejected together with `_parentResourceId`."},"metadata":{"type":"object","additionalProperties":true,"description":"Free-form metadata stored with the resource, for example Data Intelligence attributes."},"resourceFields":{"type":"array","description":"Field catalog of the records this resource returns, used by tooling to\ndescribe the API's payloads. Fields nest through their own\n`resourceFields`.","items":{"$ref":"#/components/schemas/ResourceField"}},"supportedBy":{"$ref":"#/components/schemas/ResourceSupportedBy"}}},"ResourceField":{"type":"object","description":"One field of the resource's records, optionally with nested child fields.","required":["id"],"properties":{"id":{"type":"string","description":"Field identifier as it appears in the record."},"label":{"type":"string","description":"Display label for the field."},"description":{"type":"string","description":"Help text describing the field."},"dataType":{"type":"string","description":"Data type label for the field, stored as given."},"metadata":{"type":"object","additionalProperties":true,"description":"Free-form metadata for the field."},"resourceFields":{"type":"array","description":"Child fields of an object or array field. Absent when the field is scalar.","items":{"type":"object","additionalProperties":true,"description":"Nested field with the same shape as its parent."}}}},"ResourceSupportedBy":{"type":"object","description":"Defaults the connector framework applies when a user builds an export or\nan import on one of this resource's endpoints. Each section\npre-configures fields, lists the fields the user must still fill in, and\nclears fields that do not apply.","properties":{"export":{"$ref":"#/components/schemas/ResourceSupportedBySection"},"import":{"allOf":[{"$ref":"#/components/schemas/ResourceSupportedBySection"},{"type":"object","properties":{"pathParameterToIdentifyExisting":{"type":"string","description":"Path parameter whose value identifies the existing record on\nan update or upsert import. Needed only when the endpoint has\nmore than one path parameter."},"lookupToIdentifyExisting":{"type":"object","description":"Lookup the import runs to find out whether a record already\nexists before deciding between create and update. Both\nfields go together — sending one without the other is\nrejected.","properties":{"_httpConnectorEndpointId":{"type":"string","format":"objectId","description":"HTTP Connector Endpoint that performs the lookup. Must be\nan existing endpoint."},"extract":{"type":"string","description":"Path in the lookup response to read the existing record's identifier from."}}}}}]}}},"ResourceSupportedBySection":{"type":"object","description":"Conditions, pre-configured field values, required user inputs, and\nfields to clear for one resource type (export or import) created from\nthis resource.","properties":{"conditions":{"type":"array","description":"Expression-based filters referenced by `_conditionIds` in\n`preConfiguredFields` and `fieldsUserMustSet` to apply those entries\nconditionally.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Identifier of this condition, referenced by `_conditionIds` in field entries."},"condition":{"$ref":"#/components/schemas/Filter"}}}},"preConfiguredFields":{"type":"array","description":"Fields set automatically on the generated export or import. Not editable by the user.","items":{"type":"object","properties":{"path":{"type":"string","description":"Dot-notation name of the setting in the connector's form. It is not always a literal\npath on the generated export or import: a form group such as `response` takes an\nobject value (`{resourcePath: \"customers\"}`) that sets the step's\n`http.response.resourcePath`."},"values":{"type":"array","description":"Value(s) to assign. Typically a single-element array; entries may be any JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this entry to apply. Always applies when absent.","items":{"type":"string","format":"objectId"}}}}},"fieldsUserMustSet":{"type":"array","description":"Fields the user must provide values for on the generated export or import.","items":{"type":"object","properties":{"path":{"type":"string","description":"Dot-notation name of the setting the connector's form asks for: a step field such as\n`ignoreExisting` or `type`, or `mapping.fields.generate.<field>`, a destination field\nthe import's mapping must produce."},"values":{"type":"array","description":"Optional suggested or constrained values. Entries may be any JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this entry to apply.","items":{"type":"string","format":"objectId"}},"helpURL":{"type":"string","description":"URL to documentation for this field."},"labelOverride":{"type":"string","description":"Custom label shown in the UI instead of the default."}}}},"fieldsToUnset":{"type":"array","description":"Dot-notation paths to clear on the generated export or import.","items":{"type":"string"}}}},"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"}}}}},"HTTPConnectorResource":{"type":"object","required":["_id","_httpConnectorId","name","published","createdAt","lastModified"],"description":"HTTP Connector Resource as returned by `GET /v1/httpconnectorresources`,\n`GET /v1/httpconnectorresources/{_id}`, and the nested\n`GET /v1/httpconnectors/{_httpConnectorId}/{_id}` — all three return the\nsame object. Optional fields that were never set are absent.","allOf":[{"$ref":"#/components/schemas/HTTPConnectorResourceBase"},{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for the resource. Doubles as the\n`_httpConnectorResourceId` path parameter of the HTTP Connector\nEndpoints API."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was created."},"lastModified":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was last updated. Changes on every PUT."}}}]},"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/httpconnectorresources/{_id}":{"put":{"operationId":"updateHttpConnectorResource","tags":["HTTP Connector Resources"],"summary":"Update an HTTP Connector Resource","description":"Replaces the resource with the request body. Send the complete document —\n`_versionIds`, `metadata`, `resourceFields`, `supportedBy`, and the other\noptional fields are cleared when left out, while `published` and `isRoot`\nkeep their stored values when omitted. `name` and `_httpConnectorId` are\nrequired on every PUT. Publish a resource by sending `published: true`.","parameters":[{"in":"path","name":"_id","required":true,"schema":{"type":"string","format":"objectId"},"description":"HTTP Connector Resource ID."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Request"}}}},"responses":{"200":{"description":"Updated resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPConnectorResource"}}}},"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 Resource

> Deletes the resource. Refused while any HTTP Connector Endpoint still\
> lists it in \`\_httpConnectorResourceIds\` — delete or re-point those\
> endpoints first. A connector likewise cannot be deleted while it still has\
> resources. Not recoverable through the recycle bin.

```json
{"openapi":"3.2.0","info":{"title":"HTTP Connector Resources","version":"1.0.0"},"tags":[{"name":"HTTP Connector Resources","description":"HTTP Connector Resources are the logical API groupings (for example\n\"Account\", \"Contact\", \"Order\") inside an HTTP Connector. Each resource\nbelongs to one connector, is available in one or more of its versions,\nand owns the HTTP Connector Endpoints that define the operations users\ncan build exports and imports on.\n\nManage your own resources through `/v1/httpconnectorresources`\n(list, create) and `/v1/httpconnectorresources/{_id}` (get, update,\ndelete). The nested `/v1/httpconnectors/{_httpConnectorId}/...` routes\nare read-only views scoped to one connector that also reach resources\npublished by other partners; a resource read through either route is\nthe same object.\n\n## HTTP connector resource schema\n\n{% openapi-schemas spec=\"httpconnectorresource\" schemas=\"HTTPConnectorResource\" 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/httpconnectorresources/{_id}":{"delete":{"operationId":"deleteHttpConnectorResource","tags":["HTTP Connector Resources"],"summary":"Delete an HTTP Connector Resource","description":"Deletes the resource. Refused while any HTTP Connector Endpoint still\nlists it in `_httpConnectorResourceIds` — delete or re-point those\nendpoints first. A connector likewise cannot be deleted while it still has\nresources. Not recoverable through the recycle bin.","parameters":[{"in":"path","name":"_id","required":true,"schema":{"type":"string","format":"objectId"},"description":"HTTP Connector Resource ID."}],"responses":{"204":{"description":"Resource deleted."},"401":{"$ref":"#/components/responses/401-unauthorized"},"403":{"$ref":"#/components/responses/403-forbidden"},"404":{"$ref":"#/components/responses/404-not-found"},"422":{"description":"An endpoint still references the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## List a connector's HTTP Connector Resources

> Returns the resources defined under the given HTTP Connector — your own\
> and, for connectors published by other partners, their published\
> resources — sorted by name. The whole list is returned in one response.\
> \
> The shape is abridged: it omits \`published\`, \`\_httpConnectorId\`, and the\
> configuration fields. Use \`GET /v1/httpconnectors/{\_httpConnectorId}/{\_id}\`\
> for the full object, or \`GET /v1/httpconnectorresources\` for the full\
> shape of everything your account owns.\
> \
> Each resource's \`\_id\` doubles as the \`\_httpConnectorResourceId\` path\
> parameter used by the HTTP Connector Endpoints API.

```json
{"openapi":"3.2.0","info":{"title":"HTTP Connector Resources","version":"1.0.0"},"tags":[{"name":"HTTP Connector Resources","description":"HTTP Connector Resources are the logical API groupings (for example\n\"Account\", \"Contact\", \"Order\") inside an HTTP Connector. Each resource\nbelongs to one connector, is available in one or more of its versions,\nand owns the HTTP Connector Endpoints that define the operations users\ncan build exports and imports on.\n\nManage your own resources through `/v1/httpconnectorresources`\n(list, create) and `/v1/httpconnectorresources/{_id}` (get, update,\ndelete). The nested `/v1/httpconnectors/{_httpConnectorId}/...` routes\nare read-only views scoped to one connector that also reach resources\npublished by other partners; a resource read through either route is\nthe same object.\n\n## HTTP connector resource schema\n\n{% openapi-schemas spec=\"httpconnectorresource\" schemas=\"HTTPConnectorResource\" 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 Resource returned by the nested\n`GET /v1/httpconnectors/{_httpConnectorId}/httpconnectorresources`\ncatalog listing. Omits `published`, `_httpConnectorId`, and the\nconfiguration fields; fetch the full object by id.","required":["_id","name","createdAt","lastModified"],"properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for the resource."},"name":{"type":"string","description":"Human-readable name of the API resource."},"_versionIds":{"type":"array","description":"Connector version IDs this resource is available in. Absent when the resource is not tied to a version.","items":{"type":"string","format":"objectId"}},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was created."},"lastModified":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was last updated."}}},"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"]}}}}}},"paths":{"/v1/httpconnectors/{_httpConnectorId}/httpconnectorresources":{"get":{"operationId":"listHttpConnectorResources","tags":["HTTP Connector Resources"],"summary":"List a connector's HTTP Connector Resources","description":"Returns the resources defined under the given HTTP Connector — your own\nand, for connectors published by other partners, their published\nresources — sorted by name. The whole list is returned in one response.\n\nThe shape is abridged: it omits `published`, `_httpConnectorId`, and the\nconfiguration fields. Use `GET /v1/httpconnectors/{_httpConnectorId}/{_id}`\nfor the full object, or `GET /v1/httpconnectorresources` for the full\nshape of everything your account owns.\n\nEach resource's `_id` doubles as the `_httpConnectorResourceId` path\nparameter used by the HTTP Connector Endpoints API.","parameters":[{"in":"path","name":"_httpConnectorId","required":true,"schema":{"type":"string","format":"objectId"},"description":"HTTP Connector ID."},{"in":"query","name":"version","required":false,"schema":{"type":"string","format":"objectId"},"description":"Return only resources available in this connector version (`versions[]._id`)."},{"in":"query","name":"publishedOnly","required":false,"schema":{"type":"boolean","default":false},"description":"When true, returns only published resources that belong to a published\nversion of the connector. The connector itself must be published,\notherwise the request fails with 404."}],"responses":{"200":{"description":"Abridged resources of the connector.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ListItem"}}}}},"204":{"description":"The connector has no resources visible to the caller."},"401":{"$ref":"#/components/responses/401-unauthorized"},"404":{"description":"The connector does not exist, is not yours, and is not published.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Get an HTTP connector resource

> Retrieves a specific HTTP Connector Resource by its unique identifier —\
> the same object \`GET /v1/httpconnectorresources/{\_id}\` returns, but this\
> route also reaches resources published by other partners.\
> \
> The path uses a shortcut form: \`/v1/httpconnectors/{\_httpConnectorId}/{\_id}\`\
> where \`{\_id}\` is the resource ID directly under the connector. The longer\
> form \`/v1/httpconnectors/{\_httpConnectorId}/httpconnectorresources/{\_id}\`\
> is not supported and fails with an \`invalid\_ref\` error.\
> \
> The detail response includes \`published\`, \`\_httpConnectorId\`, and the\
> configuration fields that are omitted from the list endpoint.

````json
{"openapi":"3.2.0","info":{"title":"HTTP Connector Resources","version":"1.0.0"},"tags":[{"name":"HTTP Connector Resources","description":"HTTP Connector Resources are the logical API groupings (for example\n\"Account\", \"Contact\", \"Order\") inside an HTTP Connector. Each resource\nbelongs to one connector, is available in one or more of its versions,\nand owns the HTTP Connector Endpoints that define the operations users\ncan build exports and imports on.\n\nManage your own resources through `/v1/httpconnectorresources`\n(list, create) and `/v1/httpconnectorresources/{_id}` (get, update,\ndelete). The nested `/v1/httpconnectors/{_httpConnectorId}/...` routes\nare read-only views scoped to one connector that also reach resources\npublished by other partners; a resource read through either route is\nthe same object.\n\n## HTTP connector resource schema\n\n{% openapi-schemas spec=\"httpconnectorresource\" schemas=\"HTTPConnectorResource\" 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":{"HTTPConnectorResource":{"type":"object","required":["_id","_httpConnectorId","name","published","createdAt","lastModified"],"description":"HTTP Connector Resource as returned by `GET /v1/httpconnectorresources`,\n`GET /v1/httpconnectorresources/{_id}`, and the nested\n`GET /v1/httpconnectors/{_httpConnectorId}/{_id}` — all three return the\nsame object. Optional fields that were never set are absent.","allOf":[{"$ref":"#/components/schemas/HTTPConnectorResourceBase"},{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for the resource. Doubles as the\n`_httpConnectorResourceId` path parameter of the HTTP Connector\nEndpoints API."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was created."},"lastModified":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was last updated. Changes on every PUT."}}}]},"HTTPConnectorResourceBase":{"type":"object","description":"Writable fields shared by the request and response schemas.","properties":{"name":{"type":"string","description":"Human-readable name of the API resource this grouping represents (for example \"Account\", \"Contact\", \"Order\")."},"published":{"type":"boolean","default":false,"description":"When true, the resource is visible to users of the connector's\npublished catalog. Only resources whose owner may publish HTTP\nconnectors appear to other accounts."},"_httpConnectorId":{"type":"string","format":"objectId","description":"HTTP Connector this resource belongs to. Must be a connector owned by\nthe caller's account."},"_httpConnectorApiId":{"type":"string","format":"objectId","description":"API group (an entry of the connector's `apis[]`) this resource belongs\nto. Set only for grouped connectors; flat connectors scope resources by\n`_versionIds` instead."},"_versionIds":{"type":"array","description":"Connector (or API group) versions this resource is available in. Each\nid must be one of the connector's `versions[]._id` values.","items":{"type":"string","format":"objectId"}},"_parentResourceId":{"type":"string","format":"objectId","description":"Parent resource when this resource is nested under another one (for\nexample \"Order line\" under \"Order\"). Omit for top-level resources;\ncannot be combined with `isRoot: true`."},"isRoot":{"type":"boolean","default":false,"description":"When true, marks the resource as the root of a resource hierarchy.\nRejected together with `_parentResourceId`."},"metadata":{"type":"object","additionalProperties":true,"description":"Free-form metadata stored with the resource, for example Data Intelligence attributes."},"resourceFields":{"type":"array","description":"Field catalog of the records this resource returns, used by tooling to\ndescribe the API's payloads. Fields nest through their own\n`resourceFields`.","items":{"$ref":"#/components/schemas/ResourceField"}},"supportedBy":{"$ref":"#/components/schemas/ResourceSupportedBy"}}},"ResourceField":{"type":"object","description":"One field of the resource's records, optionally with nested child fields.","required":["id"],"properties":{"id":{"type":"string","description":"Field identifier as it appears in the record."},"label":{"type":"string","description":"Display label for the field."},"description":{"type":"string","description":"Help text describing the field."},"dataType":{"type":"string","description":"Data type label for the field, stored as given."},"metadata":{"type":"object","additionalProperties":true,"description":"Free-form metadata for the field."},"resourceFields":{"type":"array","description":"Child fields of an object or array field. Absent when the field is scalar.","items":{"type":"object","additionalProperties":true,"description":"Nested field with the same shape as its parent."}}}},"ResourceSupportedBy":{"type":"object","description":"Defaults the connector framework applies when a user builds an export or\nan import on one of this resource's endpoints. Each section\npre-configures fields, lists the fields the user must still fill in, and\nclears fields that do not apply.","properties":{"export":{"$ref":"#/components/schemas/ResourceSupportedBySection"},"import":{"allOf":[{"$ref":"#/components/schemas/ResourceSupportedBySection"},{"type":"object","properties":{"pathParameterToIdentifyExisting":{"type":"string","description":"Path parameter whose value identifies the existing record on\nan update or upsert import. Needed only when the endpoint has\nmore than one path parameter."},"lookupToIdentifyExisting":{"type":"object","description":"Lookup the import runs to find out whether a record already\nexists before deciding between create and update. Both\nfields go together — sending one without the other is\nrejected.","properties":{"_httpConnectorEndpointId":{"type":"string","format":"objectId","description":"HTTP Connector Endpoint that performs the lookup. Must be\nan existing endpoint."},"extract":{"type":"string","description":"Path in the lookup response to read the existing record's identifier from."}}}}}]}}},"ResourceSupportedBySection":{"type":"object","description":"Conditions, pre-configured field values, required user inputs, and\nfields to clear for one resource type (export or import) created from\nthis resource.","properties":{"conditions":{"type":"array","description":"Expression-based filters referenced by `_conditionIds` in\n`preConfiguredFields` and `fieldsUserMustSet` to apply those entries\nconditionally.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Identifier of this condition, referenced by `_conditionIds` in field entries."},"condition":{"$ref":"#/components/schemas/Filter"}}}},"preConfiguredFields":{"type":"array","description":"Fields set automatically on the generated export or import. Not editable by the user.","items":{"type":"object","properties":{"path":{"type":"string","description":"Dot-notation name of the setting in the connector's form. It is not always a literal\npath on the generated export or import: a form group such as `response` takes an\nobject value (`{resourcePath: \"customers\"}`) that sets the step's\n`http.response.resourcePath`."},"values":{"type":"array","description":"Value(s) to assign. Typically a single-element array; entries may be any JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this entry to apply. Always applies when absent.","items":{"type":"string","format":"objectId"}}}}},"fieldsUserMustSet":{"type":"array","description":"Fields the user must provide values for on the generated export or import.","items":{"type":"object","properties":{"path":{"type":"string","description":"Dot-notation name of the setting the connector's form asks for: a step field such as\n`ignoreExisting` or `type`, or `mapping.fields.generate.<field>`, a destination field\nthe import's mapping must produce."},"values":{"type":"array","description":"Optional suggested or constrained values. Entries may be any JSON type."},"_conditionIds":{"type":"array","description":"Condition IDs that must be satisfied for this entry to apply.","items":{"type":"string","format":"objectId"}},"helpURL":{"type":"string","description":"URL to documentation for this field."},"labelOverride":{"type":"string","description":"Custom label shown in the UI instead of the default."}}}},"fieldsToUnset":{"type":"array","description":"Dot-notation paths to clear on the generated export or import.","items":{"type":"string"}}}},"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"}}}}},"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"]}}}}}},"paths":{"/v1/httpconnectors/{_httpConnectorId}/{_id}":{"get":{"operationId":"getHttpConnectorResourceById","tags":["HTTP Connector Resources"],"summary":"Get an HTTP connector resource","description":"Retrieves a specific HTTP Connector Resource by its unique identifier —\nthe same object `GET /v1/httpconnectorresources/{_id}` returns, but this\nroute also reaches resources published by other partners.\n\nThe path uses a shortcut form: `/v1/httpconnectors/{_httpConnectorId}/{_id}`\nwhere `{_id}` is the resource ID directly under the connector. The longer\nform `/v1/httpconnectors/{_httpConnectorId}/httpconnectorresources/{_id}`\nis not supported and fails with an `invalid_ref` error.\n\nThe detail response includes `published`, `_httpConnectorId`, and the\nconfiguration fields that are omitted from the list endpoint.","parameters":[{"in":"path","name":"_httpConnectorId","required":true,"schema":{"type":"string","format":"objectId"},"description":"HTTP Connector ID"},{"in":"path","name":"_id","required":true,"schema":{"type":"string","format":"objectId"},"description":"HTTP Connector Resource ID"}],"responses":{"200":{"description":"HTTP Connector Resource retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPConnectorResource"}}}},"400":{"description":"Invalid resource ID","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/401-unauthorized"},"404":{"description":"Resource not found or not published. Also returned when the\n`_httpConnectorId` is valid but the resource ID doesn't belong to it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````
