diff --git a/bundle/default-bundle/pom.xml b/bundle/default-bundle/pom.xml
index 43c871371b..e964c98237 100644
--- a/bundle/default-bundle/pom.xml
+++ b/bundle/default-bundle/pom.xml
@@ -37,6 +37,10 @@
io.camunda.connector
connector-aws-bedrock
+
+ io.camunda.connector
+ connector-aws-textract
+
io.camunda.connector
connector-google-drive
diff --git a/bundle/pom.xml b/bundle/pom.xml
index af08c6cd8a..997170cf70 100644
--- a/bundle/pom.xml
+++ b/bundle/pom.xml
@@ -69,6 +69,11 @@
connector-aws-sns
${project.version}
+
+ io.camunda.connector
+ connector-aws-textract
+ ${project.version}
+
io.camunda.connector
connector-kafka
diff --git a/connectors/aws/aws-textract/LICENSE.txt b/connectors/aws/aws-textract/LICENSE.txt
new file mode 100644
index 0000000000..85fdd16e79
--- /dev/null
+++ b/connectors/aws/aws-textract/LICENSE.txt
@@ -0,0 +1,5 @@
+Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH under one or more contributor license agreements and licensed to you under a proprietary license.
+You may not use this file except in compliance with the proprietary license.
+The proprietary license can be either the Camunda Self-Managed Free Edition license (available on Camunda’s website) or the Camunda Self-Managed Enterprise Edition license (a copy you obtain when you contact Camunda).
+The Camunda Self-Managed Free Edition comes for free but only allows for usage of the software (file) in non-production environments.
+If you want to use the software (file) in production, you need to purchase the Camunda Self-Managed Enterprise Edition.
\ No newline at end of file
diff --git a/connectors/aws/aws-textract/README.md b/connectors/aws/aws-textract/README.md
new file mode 100644
index 0000000000..6d2a5e57c9
--- /dev/null
+++ b/connectors/aws/aws-textract/README.md
@@ -0,0 +1,3 @@
+# AWS Textract Connector
+
+The **AWS Textract Connector** allows you to automatically extract printed text, handwriting, layout elements, and data from any document
diff --git a/connectors/aws/aws-textract/element-templates/aws-textract-outbound-connector.json b/connectors/aws/aws-textract/element-templates/aws-textract-outbound-connector.json
new file mode 100644
index 0000000000..2631ac31f7
--- /dev/null
+++ b/connectors/aws/aws-textract/element-templates/aws-textract-outbound-connector.json
@@ -0,0 +1,432 @@
+{
+ "$schema" : "https://unpkg.com/@camunda/zeebe-element-templates-json-schema/resources/schema.json",
+ "name" : "AWS Textract Outbound Connector",
+ "id" : "io.camunda.connectors.AWSTEXTRACT.v1",
+ "description" : "Automatically extract printed text, handwriting, layout elements, and data from any document",
+ "documentationRef" : "https://docs.camunda.io/docs/next/components/connectors/out-of-the-box-connectors/amazon-textract/",
+ "version" : 1,
+ "category" : {
+ "id" : "connectors",
+ "name" : "Connectors"
+ },
+ "appliesTo" : [ "bpmn:Task" ],
+ "elementType" : {
+ "value" : "bpmn:ServiceTask"
+ },
+ "groups" : [ {
+ "id" : "authentication",
+ "label" : "Authentication"
+ }, {
+ "id" : "configuration",
+ "label" : "Configuration"
+ }, {
+ "id" : "input",
+ "label" : "Configure input"
+ }, {
+ "id" : "output",
+ "label" : "Output mapping"
+ }, {
+ "id" : "error",
+ "label" : "Error handling"
+ }, {
+ "id" : "retries",
+ "label" : "Retries"
+ } ],
+ "properties" : [ {
+ "value" : "io.camunda:aws-textract:1",
+ "binding" : {
+ "property" : "type",
+ "type" : "zeebe:taskDefinition"
+ },
+ "type" : "Hidden"
+ }, {
+ "id" : "authentication.type",
+ "label" : "Authentication",
+ "description" : "Specify AWS authentication strategy. Learn more at the documentation page",
+ "value" : "credentials",
+ "group" : "authentication",
+ "binding" : {
+ "name" : "authentication.type",
+ "type" : "zeebe:input"
+ },
+ "type" : "Dropdown",
+ "choices" : [ {
+ "name" : "Default Credentials Chain (Hybrid/Self-Managed only)",
+ "value" : "defaultCredentialsChain"
+ }, {
+ "name" : "Credentials",
+ "value" : "credentials"
+ } ]
+ }, {
+ "id" : "authentication.accessKey",
+ "label" : "Access key",
+ "description" : "Provide an IAM access key tailored to a user, equipped with the necessary permissions",
+ "optional" : false,
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "feel" : "optional",
+ "group" : "authentication",
+ "binding" : {
+ "name" : "authentication.accessKey",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "authentication.type",
+ "equals" : "credentials",
+ "type" : "simple"
+ },
+ "type" : "String"
+ }, {
+ "id" : "authentication.secretKey",
+ "label" : "Secret key",
+ "description" : "Provide a secret key of a user with permissions to invoke specified AWS Lambda function",
+ "optional" : false,
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "feel" : "optional",
+ "group" : "authentication",
+ "binding" : {
+ "name" : "authentication.secretKey",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "authentication.type",
+ "equals" : "credentials",
+ "type" : "simple"
+ },
+ "type" : "String"
+ }, {
+ "id" : "configuration.region",
+ "label" : "Region",
+ "description" : "Specify the AWS region",
+ "optional" : false,
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "feel" : "optional",
+ "group" : "configuration",
+ "binding" : {
+ "name" : "configuration.region",
+ "type" : "zeebe:input"
+ },
+ "type" : "String"
+ }, {
+ "id" : "configuration.endpoint",
+ "label" : "Endpoint",
+ "description" : "Specify endpoint if need to use custom endpoint",
+ "optional" : true,
+ "group" : "configuration",
+ "binding" : {
+ "name" : "configuration.endpoint",
+ "type" : "zeebe:input"
+ },
+ "type" : "Hidden"
+ }, {
+ "id" : "input.executionType",
+ "label" : "Execution type",
+ "description" : "Endpoint inference type",
+ "optional" : false,
+ "value" : "ASYNC",
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "group" : "input",
+ "binding" : {
+ "name" : "input.executionType",
+ "type" : "zeebe:input"
+ },
+ "type" : "Dropdown",
+ "choices" : [ {
+ "name" : "Asynchronous",
+ "value" : "ASYNC"
+ }, {
+ "name" : "Real-time",
+ "value" : "SYNC"
+ }, {
+ "name" : "Polling",
+ "value" : "POLLING"
+ } ]
+ }, {
+ "id" : "input.documentS3Bucket",
+ "label" : "Document bucket",
+ "description" : "S3 bucket that contains document that needs to be processed",
+ "optional" : false,
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.documentS3Bucket",
+ "type" : "zeebe:input"
+ },
+ "type" : "String"
+ }, {
+ "id" : "input.documentName",
+ "label" : "Document path",
+ "description" : "S3 document path to be processed",
+ "optional" : false,
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.documentName",
+ "type" : "zeebe:input"
+ },
+ "type" : "String"
+ }, {
+ "id" : "input.documentVersion",
+ "label" : "Document version",
+ "description" : "S3 document version to be processed",
+ "optional" : true,
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.documentVersion",
+ "type" : "zeebe:input"
+ },
+ "type" : "String"
+ }, {
+ "id" : "input.analyzeTables",
+ "label" : "Analyze tables",
+ "optional" : false,
+ "value" : true,
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.analyzeTables",
+ "type" : "zeebe:input"
+ },
+ "type" : "Boolean"
+ }, {
+ "id" : "input.analyzeForms",
+ "label" : "Analyze form",
+ "optional" : false,
+ "value" : true,
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.analyzeForms",
+ "type" : "zeebe:input"
+ },
+ "type" : "Boolean"
+ }, {
+ "id" : "input.analyzeSignatures",
+ "label" : "Analyze signatures",
+ "optional" : false,
+ "value" : true,
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.analyzeSignatures",
+ "type" : "zeebe:input"
+ },
+ "type" : "Boolean"
+ }, {
+ "id" : "input.analyzeLayout",
+ "label" : "Analyze layout",
+ "optional" : false,
+ "value" : true,
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.analyzeLayout",
+ "type" : "zeebe:input"
+ },
+ "type" : "Boolean"
+ }, {
+ "id" : "input.clientRequestToken",
+ "label" : "Client request token",
+ "description" : "The idempotent token that you use to identify the start request",
+ "optional" : true,
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.clientRequestToken",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "input.executionType",
+ "equals" : "ASYNC",
+ "type" : "simple"
+ },
+ "type" : "String"
+ }, {
+ "id" : "input.jobTag",
+ "label" : "Job tag",
+ "description" : "An identifier that you specify that's included in the completion notification published to the Amazon SNS topic",
+ "optional" : true,
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.jobTag",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "input.executionType",
+ "equals" : "ASYNC",
+ "type" : "simple"
+ },
+ "type" : "String"
+ }, {
+ "id" : "input.kmsKeyId",
+ "label" : "KMS key ID",
+ "description" : "The KMS key used to encrypt the inference results",
+ "optional" : true,
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.kmsKeyId",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "input.executionType",
+ "equals" : "ASYNC",
+ "type" : "simple"
+ },
+ "type" : "String"
+ }, {
+ "id" : "input.notificationChannelRoleArn",
+ "label" : "Notification channel role ARN",
+ "description" : "The Amazon SNS topic role ARN that you want Amazon Textract to publish the completion status of the operation to",
+ "optional" : true,
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.notificationChannelRoleArn",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "input.executionType",
+ "equals" : "ASYNC",
+ "type" : "simple"
+ },
+ "type" : "String"
+ }, {
+ "id" : "input.notificationChannelSnsTopicArn",
+ "label" : "Notification channel SNS topic ARN",
+ "description" : "The Amazon SNS topic ARN that you want Amazon Textract to publish the completion status of the operation to",
+ "optional" : true,
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.notificationChannelSnsTopicArn",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "input.executionType",
+ "equals" : "ASYNC",
+ "type" : "simple"
+ },
+ "type" : "String"
+ }, {
+ "id" : "input.outputConfigS3Bucket",
+ "label" : "Output S3 bucket",
+ "description" : "The name of the bucket your output will go to",
+ "optional" : true,
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.outputConfigS3Bucket",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "input.executionType",
+ "equals" : "ASYNC",
+ "type" : "simple"
+ },
+ "type" : "String"
+ }, {
+ "id" : "input.outputConfigS3Prefix",
+ "label" : "Output S3 prefix",
+ "description" : "The prefix of the object key that the output will be saved to",
+ "optional" : true,
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.outputConfigS3Prefix",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "input.executionType",
+ "equals" : "ASYNC",
+ "type" : "simple"
+ },
+ "type" : "String"
+ }, {
+ "id" : "resultVariable",
+ "label" : "Result variable",
+ "description" : "Name of variable to store the response in",
+ "group" : "output",
+ "binding" : {
+ "key" : "resultVariable",
+ "type" : "zeebe:taskHeader"
+ },
+ "type" : "String"
+ }, {
+ "id" : "resultExpression",
+ "label" : "Result expression",
+ "description" : "Expression to map the response into process variables",
+ "feel" : "required",
+ "group" : "output",
+ "binding" : {
+ "key" : "resultExpression",
+ "type" : "zeebe:taskHeader"
+ },
+ "type" : "Text"
+ }, {
+ "id" : "errorExpression",
+ "label" : "Error expression",
+ "description" : "Expression to handle errors. Details in the documentation.",
+ "feel" : "required",
+ "group" : "error",
+ "binding" : {
+ "key" : "errorExpression",
+ "type" : "zeebe:taskHeader"
+ },
+ "type" : "Text"
+ }, {
+ "id" : "retryCount",
+ "label" : "Retries",
+ "description" : "Number of retries",
+ "value" : "3",
+ "feel" : "optional",
+ "group" : "retries",
+ "binding" : {
+ "property" : "retries",
+ "type" : "zeebe:taskDefinition"
+ },
+ "type" : "String"
+ }, {
+ "id" : "retryBackoff",
+ "label" : "Retry backoff",
+ "description" : "ISO-8601 duration to wait between retries",
+ "value" : "PT0S",
+ "feel" : "optional",
+ "group" : "retries",
+ "binding" : {
+ "key" : "retryBackoff",
+ "type" : "zeebe:taskHeader"
+ },
+ "type" : "String"
+ } ],
+ "icon" : {
+ "contents" : "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iODBweCIgaGVpZ2h0PSI4MHB4IiB2aWV3Qm94PSIwIDAgODAgODAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+SWNvbi1BcmNoaXRlY3R1cmUvNjQvQXJjaF9BbWF6b24tVGV4dHJhY3RfNjQ8L3RpdGxlPgogICAgPGcgaWQ9Ikljb24tQXJjaGl0ZWN0dXJlLzY0L0FyY2hfQW1hem9uLVRleHRyYWN0XzY0IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iSWNvbi1BcmNoaXRlY3R1cmUtQkcvNjQvTWFjaGluZS1MZWFybmluZyIgZmlsbD0iIzk5NjlmNyI+CiAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUiIHg9IjAiIHk9IjAiIHdpZHRoPSI4MCIgaGVpZ2h0PSI4MCI+PC9yZWN0PgogICAgICAgIDwvZz4KICAgICAgICA8cGF0aCBkPSJNMjIuMDYyNDEwMiw1MCBDMjQuMzc2Mzg5NSw1My42MDMgMjguNDEwMzUzNSw1NiAzMy4wMDAzMTI1LDU2IEM0MC4xNjcyNDg1LDU2IDQ1Ljk5OTE5NjQsNTAuMTY4IDQ1Ljk5OTE5NjQsNDMgQzQ1Ljk5OTE5NjQsMzUuODMyIDQwLjE2NzI0ODUsMzAgMzMuMDAwMzEyNSwzMCBDMjcuNjAzMzYwNywzMCAyMi45NjY0MDIxLDMzLjMwNyAyMS4wMDI0MTk2LDM4IEwyMy4yMTQzOTk5LDM4IEMyNS4wMzkzODM2LDM0LjQ0NCAyOC43MzYzNTA2LDMyIDMzLjAwMDMxMjUsMzIgQzM5LjA2NTI1ODMsMzIgNDMuOTk5MjE0MywzNi45MzUgNDMuOTk5MjE0Myw0MyBDNDMuOTk5MjE0Myw0OS4wNjUgMzkuMDY1MjU4Myw1NCAzMy4wMDAzMTI1LDU0IEMyOS41OTEzNDI5LDU0IDI2LjU0MTM3MDIsNTIuNDQxIDI0LjUyMTM4ODIsNTAgTDIyLjA2MjQxMDIsNTAgWiBNMzcuMDAwMjc2OCw0NSBMMzcuMDAwMjc2OCw0MyBMNDEuOTk5MjMyMSw0MyBDNDEuOTk5MjMyMSwzOC4wMzggMzcuOTYyMjY4MiwzNCAzMy4wMDAzMTI1LDM0IEMyOC4wMzczNTY4LDM0IDIzLjk5OTM5MjksMzguMDM4IDIzLjk5OTM5MjksNDMgTDI4Ljk5OTM0ODIsNDMgTDI4Ljk5OTM0ODIsNDUgTDI0LjIzMTM5MDgsNDUgQzI1LjE0NDM4MjYsNDkuMDAyIDI4LjcyNTM1MDcsNTIgMzMuMDAwMzEyNSw1MiBDMzUuMTM2MjkzNCw1MiAzNy4wOTkyNzU5LDUxLjI0OSAzOC42NDQyNjIxLDUwIEwzNC4wMDAzMDM2LDUwIEwzNC4wMDAzMDM2LDQ4IEw0MC40NzgyNDU3LDQ4IEM0MS4wODEyNDAzLDQ3LjEwMiA0MS41MjAyMzY0LDQ2LjA4NyA0MS43NjgyMzQyLDQ1IEwzNy4wMDAyNzY4LDQ1IFogTTIxLjAwMjQxOTYsNDggTDIzLjIxNDM5OTksNDggQzIyLjQ0MzQwNjgsNDYuNDk4IDIyLjAwMDQxMDcsNDQuODAxIDIyLjAwMDQxMDcsNDMgQzIyLjAwMDQxMDcsNDEuOTU5IDIyLjE1NTQwOTMsNDAuOTU1IDIyLjQyNjQwNjksNDAgTDIwLjM2MzQyNTMsNDAgQzIwLjEzNDQyNzQsNDAuOTY1IDE5Ljk5OTQyODYsNDEuOTY2IDE5Ljk5OTQyODYsNDMgQzE5Ljk5OTQyODYsNDQuNzcxIDIwLjM1ODQyNTQsNDYuNDYgMjEuMDAyNDE5Niw0OCBMMjEuMDAyNDE5Niw0OCBaIE0xOS43NDM0MzA5LDUwIEwxNy4wMDA0NTU0LDUwIEwxNy4wMDA0NTU0LDQ4IEwxOC44NzQ0Mzg2LDQ4IEMxOC41MzQ0NDE3LDQ3LjA0IDE4LjI4OTQ0MzgsNDYuMDM4IDE4LjE0OTQ0NTEsNDUgTDE1LjQxNDQ2OTUsNDUgTDE2LjcwNzQ1OCw0Ni4yOTMgTDE1LjI5MjQ3MDYsNDcuNzA3IEwxMi4yOTI0OTc0LDQ0LjcwNyBDMTEuOTAyNTAwOSw0NC4zMTYgMTEuOTAyNTAwOSw0My42ODQgMTIuMjkyNDk3NCw0My4yOTMgTDE1LjI5MjQ3MDYsNDAuMjkzIEwxNi43MDc0NTgsNDEuNzA3IEwxNS40MTQ0Njk1LDQzIEwxOC4wMDA0NDY0LDQzIEMxOC4wMDA0NDY0LDQxLjk3MyAxOC4xMDQ0NDU1LDQwLjk3IDE4LjMwMjQ0MzcsNDAgTDE3LjAwMDQ1NTQsNDAgTDE3LjAwMDQ1NTQsMzggTDE4Ljg3NDQzODYsMzggQzIwLjk0MDQyMDIsMzIuMTg0IDI2LjQ4MzM3MDcsMjggMzMuMDAwMzEyNSwyOCBDMzcuNDI3MjczLDI4IDQxLjQwMDIzNzUsMjkuOTM5IDQ0LjE0ODIxMywzMyBMNTkuMDAwMDgwNCwzMyBMNTkuMDAwMDgwNCwzNSBMNDUuNjY2MTk5NCwzNSBDNDcuMTM1MTg2MywzNy4zMTggNDcuOTk5MTc4Niw0MC4wNTggNDcuOTk5MTc4Niw0MyBMNTkuMDAwMDgwNCw0MyBMNTkuMDAwMDgwNCw0NSBMNDcuODUwMTc5OSw0NSBDNDYuODY4MTg4Nyw1Mi4zMjcgNDAuNTkxMjQ0Nyw1OCAzMy4wMDAzMTI1LDU4IEMyNy4yNTYzNjM4LDU4IDIyLjI2MjQwODQsNTQuNzUyIDE5Ljc0MzQzMDksNTAgTDE5Ljc0MzQzMDksNTAgWiBNMzcuMDAwMjc2OCwzOSBDMzcuMDAwMjc2OCwzOC40NDggMzYuNTUyMjgwOCwzOCAzNi4wMDAyODU3LDM4IEwyOS45OTkzNDgyLDM4IEMyOS40NDczNDQyLDM4IDI4Ljk5OTM0ODIsMzguNDQ4IDI4Ljk5OTM0ODIsMzkgTDI4Ljk5OTM0ODIsNDEgTDMxLjAwMDMzMDQsNDEgTDMxLjAwMDMzMDQsNDAgTDMyLjAwMDMyMTQsNDAgTDMyLjAwMDMyMTQsNDMgTDMxLjAwMDMzMDQsNDMgTDMxLjAwMDMzMDQsNDUgTDM1LjAwMDI5NDYsNDUgTDM1LjAwMDI5NDYsNDMgTDM0LjAwMDMwMzYsNDMgTDM0LjAwMDMwMzYsNDAgTDM1LjAwMDI5NDYsNDAgTDM1LjAwMDI5NDYsNDEgTDM3LjAwMDI3NjgsNDEgTDM3LjAwMDI3NjgsMzkgWiBNNDkuMDAwMTY5Niw0MCBMNTkuMDAwMDgwNCw0MCBMNTkuMDAwMDgwNCwzOCBMNDkuMDAwMTY5NiwzOCBMNDkuMDAwMTY5Niw0MCBaIE00OS4wMDAxNjk2LDUwIEw1OS4wMDAwODA0LDUwIEw1OS4wMDAwODA0LDQ4IEw0OS4wMDAxNjk2LDQ4IEw0OS4wMDAxNjk2LDUwIFogTTU3LjAwMDA5ODIsMjcgTDYwLjU4NTA2NjIsMjcgTDU3LjAwMDA5ODIsMjMuNDE0IEw1Ny4wMDAwOTgyLDI3IFogTTYzLjcwNzAzODMsMjcuMjkzIEM2My44OTQwMzY3LDI3LjQ4IDY0LjAwMDAzNTcsMjcuNzM1IDY0LjAwMDAzNTcsMjggTDY0LjAwMDAzNTcsNjMgQzY0LjAwMDAzNTcsNjMuNTUyIDYzLjU1MjAzOTcsNjQgNjMuMDAwMDQ0Niw2NCBMMzIuMDAwMzMwNCw2NCBDMzEuNDQ3MzI2NCw2NCAzMS4wMDAzMzA0LDYzLjU1MiAzMS4wMDAzMzA0LDYzIEwzMS4wMDAzMzA0LDU5IEwzMy4wMDAzMTI1LDU5IEwzMy4wMDAzMTI1LDYyIEw2Mi4wMDAwNTM2LDYyIEw2Mi4wMDAwNTM2LDI5IEw1Ni4wMDAxMDcxLDI5IEM1NS40NDcxMTIxLDI5IDU1LjAwMDExNjEsMjguNTUyIDU1LjAwMDExNjEsMjggTDU1LjAwMDExNjEsMjIgTDMzLjAwMDMxMjUsMjIgTDMzLjAwMDMxMjUsMjcgTDMxLjAwMDMzMDQsMjcgTDMxLjAwMDMzMDQsMjEgQzMxLjAwMDMzMDQsMjAuNDQ4IDMxLjQ0NzMyNjQsMjAgMzIuMDAwMzMwNCwyMCBMNTYuMDAwMTA3MSwyMCBDNTYuMjY1MTA0OCwyMCA1Ni41MTkxMDI1LDIwLjEwNSA1Ni43MDcxMDA4LDIwLjI5MyBMNjMuNzA3MDM4MywyNy4yOTMgWiBNNjgsMjQuMTY2IEw2OCw2MSBDNjgsNjEuNTUyIDY3LjU1MjAwNCw2MiA2Ny4wMDAwMDg5LDYyIEw2NS4wMDAwMjY4LDYyIEw2NS4wMDAwMjY4LDYwIEw2Ni4wMDAwMTc5LDYwIEw2Ni4wMDAwMTc5LDI0LjYxMiBMNTguNjE3MDgzOCwxOCBMMzYuMDAwMjg1NywxOCBMMzYuMDAwMjg1NywxOSBMMzQuMDAwMzAzNiwxOSBMMzQuMDAwMzAzNiwxNyBDMzQuMDAwMzAzNiwxNi40NDggMzQuNDQ3Mjk5NiwxNiAzNS4wMDAzMDM2LDE2IEw1OS4wMDAwODA0LDE2IEM1OS4yNDYwNzgyLDE2IDU5LjQ4MzA3NiwxNi4wOTEgNTkuNjY2MDc0NCwxNi4yNTUgTDY3LjY2NjAwMywyMy40MiBDNjcuODc4MDAxMSwyMy42MSA2OCwyMy44ODEgNjgsMjQuMTY2IEw2OCwyNC4xNjYgWiIgaWQ9IkFtYXpvbi1UZXh0cmFjdF9JY29uXzY0X1NxdWlkIiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg=="
+ }
+}
\ No newline at end of file
diff --git a/connectors/aws/aws-textract/element-templates/hybrid/aws-textract-outbound-connector-hybrid.json b/connectors/aws/aws-textract/element-templates/hybrid/aws-textract-outbound-connector-hybrid.json
new file mode 100644
index 0000000000..8b880f92d5
--- /dev/null
+++ b/connectors/aws/aws-textract/element-templates/hybrid/aws-textract-outbound-connector-hybrid.json
@@ -0,0 +1,437 @@
+{
+ "$schema" : "https://unpkg.com/@camunda/zeebe-element-templates-json-schema/resources/schema.json",
+ "name" : "Hybrid AWS Textract Outbound Connector",
+ "id" : "io.camunda.connectors.AWSTEXTRACT.v1-hybrid",
+ "description" : "Automatically extract printed text, handwriting, layout elements, and data from any document",
+ "documentationRef" : "https://docs.camunda.io/docs/next/components/connectors/out-of-the-box-connectors/amazon-textract/",
+ "version" : 1,
+ "category" : {
+ "id" : "connectors",
+ "name" : "Connectors"
+ },
+ "appliesTo" : [ "bpmn:Task" ],
+ "elementType" : {
+ "value" : "bpmn:ServiceTask"
+ },
+ "groups" : [ {
+ "id" : "taskDefinitionType",
+ "label" : "Task definition type"
+ }, {
+ "id" : "authentication",
+ "label" : "Authentication"
+ }, {
+ "id" : "configuration",
+ "label" : "Configuration"
+ }, {
+ "id" : "input",
+ "label" : "Configure input"
+ }, {
+ "id" : "output",
+ "label" : "Output mapping"
+ }, {
+ "id" : "error",
+ "label" : "Error handling"
+ }, {
+ "id" : "retries",
+ "label" : "Retries"
+ } ],
+ "properties" : [ {
+ "id" : "taskDefinitionType",
+ "value" : "io.camunda:aws-textract:1",
+ "group" : "taskDefinitionType",
+ "binding" : {
+ "property" : "type",
+ "type" : "zeebe:taskDefinition"
+ },
+ "type" : "String"
+ }, {
+ "id" : "authentication.type",
+ "label" : "Authentication",
+ "description" : "Specify AWS authentication strategy. Learn more at the documentation page",
+ "value" : "credentials",
+ "group" : "authentication",
+ "binding" : {
+ "name" : "authentication.type",
+ "type" : "zeebe:input"
+ },
+ "type" : "Dropdown",
+ "choices" : [ {
+ "name" : "Default Credentials Chain (Hybrid/Self-Managed only)",
+ "value" : "defaultCredentialsChain"
+ }, {
+ "name" : "Credentials",
+ "value" : "credentials"
+ } ]
+ }, {
+ "id" : "authentication.accessKey",
+ "label" : "Access key",
+ "description" : "Provide an IAM access key tailored to a user, equipped with the necessary permissions",
+ "optional" : false,
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "feel" : "optional",
+ "group" : "authentication",
+ "binding" : {
+ "name" : "authentication.accessKey",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "authentication.type",
+ "equals" : "credentials",
+ "type" : "simple"
+ },
+ "type" : "String"
+ }, {
+ "id" : "authentication.secretKey",
+ "label" : "Secret key",
+ "description" : "Provide a secret key of a user with permissions to invoke specified AWS Lambda function",
+ "optional" : false,
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "feel" : "optional",
+ "group" : "authentication",
+ "binding" : {
+ "name" : "authentication.secretKey",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "authentication.type",
+ "equals" : "credentials",
+ "type" : "simple"
+ },
+ "type" : "String"
+ }, {
+ "id" : "configuration.region",
+ "label" : "Region",
+ "description" : "Specify the AWS region",
+ "optional" : false,
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "feel" : "optional",
+ "group" : "configuration",
+ "binding" : {
+ "name" : "configuration.region",
+ "type" : "zeebe:input"
+ },
+ "type" : "String"
+ }, {
+ "id" : "configuration.endpoint",
+ "label" : "Endpoint",
+ "description" : "Specify endpoint if need to use custom endpoint",
+ "optional" : true,
+ "group" : "configuration",
+ "binding" : {
+ "name" : "configuration.endpoint",
+ "type" : "zeebe:input"
+ },
+ "type" : "Hidden"
+ }, {
+ "id" : "input.executionType",
+ "label" : "Execution type",
+ "description" : "Endpoint inference type",
+ "optional" : false,
+ "value" : "ASYNC",
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "group" : "input",
+ "binding" : {
+ "name" : "input.executionType",
+ "type" : "zeebe:input"
+ },
+ "type" : "Dropdown",
+ "choices" : [ {
+ "name" : "Asynchronous",
+ "value" : "ASYNC"
+ }, {
+ "name" : "Real-time",
+ "value" : "SYNC"
+ }, {
+ "name" : "Polling",
+ "value" : "POLLING"
+ } ]
+ }, {
+ "id" : "input.documentS3Bucket",
+ "label" : "Document bucket",
+ "description" : "S3 bucket that contains document that needs to be processed",
+ "optional" : false,
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.documentS3Bucket",
+ "type" : "zeebe:input"
+ },
+ "type" : "String"
+ }, {
+ "id" : "input.documentName",
+ "label" : "Document path",
+ "description" : "S3 document path to be processed",
+ "optional" : false,
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.documentName",
+ "type" : "zeebe:input"
+ },
+ "type" : "String"
+ }, {
+ "id" : "input.documentVersion",
+ "label" : "Document version",
+ "description" : "S3 document version to be processed",
+ "optional" : true,
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.documentVersion",
+ "type" : "zeebe:input"
+ },
+ "type" : "String"
+ }, {
+ "id" : "input.analyzeTables",
+ "label" : "Analyze tables",
+ "optional" : false,
+ "value" : true,
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.analyzeTables",
+ "type" : "zeebe:input"
+ },
+ "type" : "Boolean"
+ }, {
+ "id" : "input.analyzeForms",
+ "label" : "Analyze form",
+ "optional" : false,
+ "value" : true,
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.analyzeForms",
+ "type" : "zeebe:input"
+ },
+ "type" : "Boolean"
+ }, {
+ "id" : "input.analyzeSignatures",
+ "label" : "Analyze signatures",
+ "optional" : false,
+ "value" : true,
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.analyzeSignatures",
+ "type" : "zeebe:input"
+ },
+ "type" : "Boolean"
+ }, {
+ "id" : "input.analyzeLayout",
+ "label" : "Analyze layout",
+ "optional" : false,
+ "value" : true,
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.analyzeLayout",
+ "type" : "zeebe:input"
+ },
+ "type" : "Boolean"
+ }, {
+ "id" : "input.clientRequestToken",
+ "label" : "Client request token",
+ "description" : "The idempotent token that you use to identify the start request",
+ "optional" : true,
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.clientRequestToken",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "input.executionType",
+ "equals" : "ASYNC",
+ "type" : "simple"
+ },
+ "type" : "String"
+ }, {
+ "id" : "input.jobTag",
+ "label" : "Job tag",
+ "description" : "An identifier that you specify that's included in the completion notification published to the Amazon SNS topic",
+ "optional" : true,
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.jobTag",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "input.executionType",
+ "equals" : "ASYNC",
+ "type" : "simple"
+ },
+ "type" : "String"
+ }, {
+ "id" : "input.kmsKeyId",
+ "label" : "KMS key ID",
+ "description" : "The KMS key used to encrypt the inference results",
+ "optional" : true,
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.kmsKeyId",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "input.executionType",
+ "equals" : "ASYNC",
+ "type" : "simple"
+ },
+ "type" : "String"
+ }, {
+ "id" : "input.notificationChannelRoleArn",
+ "label" : "Notification channel role ARN",
+ "description" : "The Amazon SNS topic role ARN that you want Amazon Textract to publish the completion status of the operation to",
+ "optional" : true,
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.notificationChannelRoleArn",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "input.executionType",
+ "equals" : "ASYNC",
+ "type" : "simple"
+ },
+ "type" : "String"
+ }, {
+ "id" : "input.notificationChannelSnsTopicArn",
+ "label" : "Notification channel SNS topic ARN",
+ "description" : "The Amazon SNS topic ARN that you want Amazon Textract to publish the completion status of the operation to",
+ "optional" : true,
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.notificationChannelSnsTopicArn",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "input.executionType",
+ "equals" : "ASYNC",
+ "type" : "simple"
+ },
+ "type" : "String"
+ }, {
+ "id" : "input.outputConfigS3Bucket",
+ "label" : "Output S3 bucket",
+ "description" : "The name of the bucket your output will go to",
+ "optional" : true,
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.outputConfigS3Bucket",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "input.executionType",
+ "equals" : "ASYNC",
+ "type" : "simple"
+ },
+ "type" : "String"
+ }, {
+ "id" : "input.outputConfigS3Prefix",
+ "label" : "Output S3 prefix",
+ "description" : "The prefix of the object key that the output will be saved to",
+ "optional" : true,
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.outputConfigS3Prefix",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "input.executionType",
+ "equals" : "ASYNC",
+ "type" : "simple"
+ },
+ "type" : "String"
+ }, {
+ "id" : "resultVariable",
+ "label" : "Result variable",
+ "description" : "Name of variable to store the response in",
+ "group" : "output",
+ "binding" : {
+ "key" : "resultVariable",
+ "type" : "zeebe:taskHeader"
+ },
+ "type" : "String"
+ }, {
+ "id" : "resultExpression",
+ "label" : "Result expression",
+ "description" : "Expression to map the response into process variables",
+ "feel" : "required",
+ "group" : "output",
+ "binding" : {
+ "key" : "resultExpression",
+ "type" : "zeebe:taskHeader"
+ },
+ "type" : "Text"
+ }, {
+ "id" : "errorExpression",
+ "label" : "Error expression",
+ "description" : "Expression to handle errors. Details in the documentation.",
+ "feel" : "required",
+ "group" : "error",
+ "binding" : {
+ "key" : "errorExpression",
+ "type" : "zeebe:taskHeader"
+ },
+ "type" : "Text"
+ }, {
+ "id" : "retryCount",
+ "label" : "Retries",
+ "description" : "Number of retries",
+ "value" : "3",
+ "feel" : "optional",
+ "group" : "retries",
+ "binding" : {
+ "property" : "retries",
+ "type" : "zeebe:taskDefinition"
+ },
+ "type" : "String"
+ }, {
+ "id" : "retryBackoff",
+ "label" : "Retry backoff",
+ "description" : "ISO-8601 duration to wait between retries",
+ "value" : "PT0S",
+ "feel" : "optional",
+ "group" : "retries",
+ "binding" : {
+ "key" : "retryBackoff",
+ "type" : "zeebe:taskHeader"
+ },
+ "type" : "String"
+ } ],
+ "icon" : {
+ "contents" : "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iODBweCIgaGVpZ2h0PSI4MHB4IiB2aWV3Qm94PSIwIDAgODAgODAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+SWNvbi1BcmNoaXRlY3R1cmUvNjQvQXJjaF9BbWF6b24tVGV4dHJhY3RfNjQ8L3RpdGxlPgogICAgPGcgaWQ9Ikljb24tQXJjaGl0ZWN0dXJlLzY0L0FyY2hfQW1hem9uLVRleHRyYWN0XzY0IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iSWNvbi1BcmNoaXRlY3R1cmUtQkcvNjQvTWFjaGluZS1MZWFybmluZyIgZmlsbD0iIzk5NjlmNyI+CiAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUiIHg9IjAiIHk9IjAiIHdpZHRoPSI4MCIgaGVpZ2h0PSI4MCI+PC9yZWN0PgogICAgICAgIDwvZz4KICAgICAgICA8cGF0aCBkPSJNMjIuMDYyNDEwMiw1MCBDMjQuMzc2Mzg5NSw1My42MDMgMjguNDEwMzUzNSw1NiAzMy4wMDAzMTI1LDU2IEM0MC4xNjcyNDg1LDU2IDQ1Ljk5OTE5NjQsNTAuMTY4IDQ1Ljk5OTE5NjQsNDMgQzQ1Ljk5OTE5NjQsMzUuODMyIDQwLjE2NzI0ODUsMzAgMzMuMDAwMzEyNSwzMCBDMjcuNjAzMzYwNywzMCAyMi45NjY0MDIxLDMzLjMwNyAyMS4wMDI0MTk2LDM4IEwyMy4yMTQzOTk5LDM4IEMyNS4wMzkzODM2LDM0LjQ0NCAyOC43MzYzNTA2LDMyIDMzLjAwMDMxMjUsMzIgQzM5LjA2NTI1ODMsMzIgNDMuOTk5MjE0MywzNi45MzUgNDMuOTk5MjE0Myw0MyBDNDMuOTk5MjE0Myw0OS4wNjUgMzkuMDY1MjU4Myw1NCAzMy4wMDAzMTI1LDU0IEMyOS41OTEzNDI5LDU0IDI2LjU0MTM3MDIsNTIuNDQxIDI0LjUyMTM4ODIsNTAgTDIyLjA2MjQxMDIsNTAgWiBNMzcuMDAwMjc2OCw0NSBMMzcuMDAwMjc2OCw0MyBMNDEuOTk5MjMyMSw0MyBDNDEuOTk5MjMyMSwzOC4wMzggMzcuOTYyMjY4MiwzNCAzMy4wMDAzMTI1LDM0IEMyOC4wMzczNTY4LDM0IDIzLjk5OTM5MjksMzguMDM4IDIzLjk5OTM5MjksNDMgTDI4Ljk5OTM0ODIsNDMgTDI4Ljk5OTM0ODIsNDUgTDI0LjIzMTM5MDgsNDUgQzI1LjE0NDM4MjYsNDkuMDAyIDI4LjcyNTM1MDcsNTIgMzMuMDAwMzEyNSw1MiBDMzUuMTM2MjkzNCw1MiAzNy4wOTkyNzU5LDUxLjI0OSAzOC42NDQyNjIxLDUwIEwzNC4wMDAzMDM2LDUwIEwzNC4wMDAzMDM2LDQ4IEw0MC40NzgyNDU3LDQ4IEM0MS4wODEyNDAzLDQ3LjEwMiA0MS41MjAyMzY0LDQ2LjA4NyA0MS43NjgyMzQyLDQ1IEwzNy4wMDAyNzY4LDQ1IFogTTIxLjAwMjQxOTYsNDggTDIzLjIxNDM5OTksNDggQzIyLjQ0MzQwNjgsNDYuNDk4IDIyLjAwMDQxMDcsNDQuODAxIDIyLjAwMDQxMDcsNDMgQzIyLjAwMDQxMDcsNDEuOTU5IDIyLjE1NTQwOTMsNDAuOTU1IDIyLjQyNjQwNjksNDAgTDIwLjM2MzQyNTMsNDAgQzIwLjEzNDQyNzQsNDAuOTY1IDE5Ljk5OTQyODYsNDEuOTY2IDE5Ljk5OTQyODYsNDMgQzE5Ljk5OTQyODYsNDQuNzcxIDIwLjM1ODQyNTQsNDYuNDYgMjEuMDAyNDE5Niw0OCBMMjEuMDAyNDE5Niw0OCBaIE0xOS43NDM0MzA5LDUwIEwxNy4wMDA0NTU0LDUwIEwxNy4wMDA0NTU0LDQ4IEwxOC44NzQ0Mzg2LDQ4IEMxOC41MzQ0NDE3LDQ3LjA0IDE4LjI4OTQ0MzgsNDYuMDM4IDE4LjE0OTQ0NTEsNDUgTDE1LjQxNDQ2OTUsNDUgTDE2LjcwNzQ1OCw0Ni4yOTMgTDE1LjI5MjQ3MDYsNDcuNzA3IEwxMi4yOTI0OTc0LDQ0LjcwNyBDMTEuOTAyNTAwOSw0NC4zMTYgMTEuOTAyNTAwOSw0My42ODQgMTIuMjkyNDk3NCw0My4yOTMgTDE1LjI5MjQ3MDYsNDAuMjkzIEwxNi43MDc0NTgsNDEuNzA3IEwxNS40MTQ0Njk1LDQzIEwxOC4wMDA0NDY0LDQzIEMxOC4wMDA0NDY0LDQxLjk3MyAxOC4xMDQ0NDU1LDQwLjk3IDE4LjMwMjQ0MzcsNDAgTDE3LjAwMDQ1NTQsNDAgTDE3LjAwMDQ1NTQsMzggTDE4Ljg3NDQzODYsMzggQzIwLjk0MDQyMDIsMzIuMTg0IDI2LjQ4MzM3MDcsMjggMzMuMDAwMzEyNSwyOCBDMzcuNDI3MjczLDI4IDQxLjQwMDIzNzUsMjkuOTM5IDQ0LjE0ODIxMywzMyBMNTkuMDAwMDgwNCwzMyBMNTkuMDAwMDgwNCwzNSBMNDUuNjY2MTk5NCwzNSBDNDcuMTM1MTg2MywzNy4zMTggNDcuOTk5MTc4Niw0MC4wNTggNDcuOTk5MTc4Niw0MyBMNTkuMDAwMDgwNCw0MyBMNTkuMDAwMDgwNCw0NSBMNDcuODUwMTc5OSw0NSBDNDYuODY4MTg4Nyw1Mi4zMjcgNDAuNTkxMjQ0Nyw1OCAzMy4wMDAzMTI1LDU4IEMyNy4yNTYzNjM4LDU4IDIyLjI2MjQwODQsNTQuNzUyIDE5Ljc0MzQzMDksNTAgTDE5Ljc0MzQzMDksNTAgWiBNMzcuMDAwMjc2OCwzOSBDMzcuMDAwMjc2OCwzOC40NDggMzYuNTUyMjgwOCwzOCAzNi4wMDAyODU3LDM4IEwyOS45OTkzNDgyLDM4IEMyOS40NDczNDQyLDM4IDI4Ljk5OTM0ODIsMzguNDQ4IDI4Ljk5OTM0ODIsMzkgTDI4Ljk5OTM0ODIsNDEgTDMxLjAwMDMzMDQsNDEgTDMxLjAwMDMzMDQsNDAgTDMyLjAwMDMyMTQsNDAgTDMyLjAwMDMyMTQsNDMgTDMxLjAwMDMzMDQsNDMgTDMxLjAwMDMzMDQsNDUgTDM1LjAwMDI5NDYsNDUgTDM1LjAwMDI5NDYsNDMgTDM0LjAwMDMwMzYsNDMgTDM0LjAwMDMwMzYsNDAgTDM1LjAwMDI5NDYsNDAgTDM1LjAwMDI5NDYsNDEgTDM3LjAwMDI3NjgsNDEgTDM3LjAwMDI3NjgsMzkgWiBNNDkuMDAwMTY5Niw0MCBMNTkuMDAwMDgwNCw0MCBMNTkuMDAwMDgwNCwzOCBMNDkuMDAwMTY5NiwzOCBMNDkuMDAwMTY5Niw0MCBaIE00OS4wMDAxNjk2LDUwIEw1OS4wMDAwODA0LDUwIEw1OS4wMDAwODA0LDQ4IEw0OS4wMDAxNjk2LDQ4IEw0OS4wMDAxNjk2LDUwIFogTTU3LjAwMDA5ODIsMjcgTDYwLjU4NTA2NjIsMjcgTDU3LjAwMDA5ODIsMjMuNDE0IEw1Ny4wMDAwOTgyLDI3IFogTTYzLjcwNzAzODMsMjcuMjkzIEM2My44OTQwMzY3LDI3LjQ4IDY0LjAwMDAzNTcsMjcuNzM1IDY0LjAwMDAzNTcsMjggTDY0LjAwMDAzNTcsNjMgQzY0LjAwMDAzNTcsNjMuNTUyIDYzLjU1MjAzOTcsNjQgNjMuMDAwMDQ0Niw2NCBMMzIuMDAwMzMwNCw2NCBDMzEuNDQ3MzI2NCw2NCAzMS4wMDAzMzA0LDYzLjU1MiAzMS4wMDAzMzA0LDYzIEwzMS4wMDAzMzA0LDU5IEwzMy4wMDAzMTI1LDU5IEwzMy4wMDAzMTI1LDYyIEw2Mi4wMDAwNTM2LDYyIEw2Mi4wMDAwNTM2LDI5IEw1Ni4wMDAxMDcxLDI5IEM1NS40NDcxMTIxLDI5IDU1LjAwMDExNjEsMjguNTUyIDU1LjAwMDExNjEsMjggTDU1LjAwMDExNjEsMjIgTDMzLjAwMDMxMjUsMjIgTDMzLjAwMDMxMjUsMjcgTDMxLjAwMDMzMDQsMjcgTDMxLjAwMDMzMDQsMjEgQzMxLjAwMDMzMDQsMjAuNDQ4IDMxLjQ0NzMyNjQsMjAgMzIuMDAwMzMwNCwyMCBMNTYuMDAwMTA3MSwyMCBDNTYuMjY1MTA0OCwyMCA1Ni41MTkxMDI1LDIwLjEwNSA1Ni43MDcxMDA4LDIwLjI5MyBMNjMuNzA3MDM4MywyNy4yOTMgWiBNNjgsMjQuMTY2IEw2OCw2MSBDNjgsNjEuNTUyIDY3LjU1MjAwNCw2MiA2Ny4wMDAwMDg5LDYyIEw2NS4wMDAwMjY4LDYyIEw2NS4wMDAwMjY4LDYwIEw2Ni4wMDAwMTc5LDYwIEw2Ni4wMDAwMTc5LDI0LjYxMiBMNTguNjE3MDgzOCwxOCBMMzYuMDAwMjg1NywxOCBMMzYuMDAwMjg1NywxOSBMMzQuMDAwMzAzNiwxOSBMMzQuMDAwMzAzNiwxNyBDMzQuMDAwMzAzNiwxNi40NDggMzQuNDQ3Mjk5NiwxNiAzNS4wMDAzMDM2LDE2IEw1OS4wMDAwODA0LDE2IEM1OS4yNDYwNzgyLDE2IDU5LjQ4MzA3NiwxNi4wOTEgNTkuNjY2MDc0NCwxNi4yNTUgTDY3LjY2NjAwMywyMy40MiBDNjcuODc4MDAxMSwyMy42MSA2OCwyMy44ODEgNjgsMjQuMTY2IEw2OCwyNC4xNjYgWiIgaWQ9IkFtYXpvbi1UZXh0cmFjdF9JY29uXzY0X1NxdWlkIiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg=="
+ }
+}
\ No newline at end of file
diff --git a/connectors/aws/aws-textract/element-templates/hybrid/hybrid-aws-textract-outbound-connector-hybrid.json b/connectors/aws/aws-textract/element-templates/hybrid/hybrid-aws-textract-outbound-connector-hybrid.json
new file mode 100644
index 0000000000..a0e361bd98
--- /dev/null
+++ b/connectors/aws/aws-textract/element-templates/hybrid/hybrid-aws-textract-outbound-connector-hybrid.json
@@ -0,0 +1,408 @@
+{
+ "$schema" : "https://unpkg.com/@camunda/zeebe-element-templates-json-schema/resources/schema.json",
+ "name" : "Hybrid AWS Textract Outbound Connector",
+ "id" : "io.camunda.connectors.AWSSAGEMAKER.v1-hybrid",
+ "description" : "Automatically extract printed text, handwriting, layout elements, and data from any document",
+ "documentationRef" : "https://docs.camunda.io/docs/next/components/connectors/out-of-the-box-connectors/amazon-textract/",
+ "version" : 1,
+ "category" : {
+ "id" : "connectors",
+ "name" : "Connectors"
+ },
+ "appliesTo" : [ "bpmn:Task" ],
+ "elementType" : {
+ "value" : "bpmn:ServiceTask"
+ },
+ "groups" : [ {
+ "id" : "taskDefinitionType",
+ "label" : "Task definition type"
+ }, {
+ "id" : "authentication",
+ "label" : "Authentication"
+ }, {
+ "id" : "configuration",
+ "label" : "Configuration"
+ }, {
+ "id" : "input",
+ "label" : "Configure input"
+ }, {
+ "id" : "output",
+ "label" : "Output mapping"
+ }, {
+ "id" : "error",
+ "label" : "Error handling"
+ }, {
+ "id" : "retries",
+ "label" : "Retries"
+ } ],
+ "properties" : [ {
+ "id" : "taskDefinitionType",
+ "value" : "io.camunda:aws-textract:1",
+ "group" : "taskDefinitionType",
+ "binding" : {
+ "property" : "type",
+ "type" : "zeebe:taskDefinition"
+ },
+ "type" : "String"
+ }, {
+ "id" : "authentication.type",
+ "label" : "Authentication",
+ "description" : "Specify AWS authentication strategy. Learn more at the documentation page",
+ "value" : "credentials",
+ "group" : "authentication",
+ "binding" : {
+ "name" : "authentication.type",
+ "type" : "zeebe:input"
+ },
+ "type" : "Dropdown",
+ "choices" : [ {
+ "name" : "Default Credentials Chain (Hybrid/Self-Managed only)",
+ "value" : "defaultCredentialsChain"
+ }, {
+ "name" : "Credentials",
+ "value" : "credentials"
+ } ]
+ }, {
+ "id" : "authentication.accessKey",
+ "label" : "Access key",
+ "description" : "Provide an IAM access key tailored to a user, equipped with the necessary permissions",
+ "optional" : false,
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "feel" : "optional",
+ "group" : "authentication",
+ "binding" : {
+ "name" : "authentication.accessKey",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "authentication.type",
+ "equals" : "credentials",
+ "type" : "simple"
+ },
+ "type" : "String"
+ }, {
+ "id" : "authentication.secretKey",
+ "label" : "Secret key",
+ "description" : "Provide a secret key of a user with permissions to invoke specified AWS Lambda function",
+ "optional" : false,
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "feel" : "optional",
+ "group" : "authentication",
+ "binding" : {
+ "name" : "authentication.secretKey",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "authentication.type",
+ "equals" : "credentials",
+ "type" : "simple"
+ },
+ "type" : "String"
+ }, {
+ "id" : "configuration.region",
+ "label" : "Region",
+ "description" : "Specify the AWS region",
+ "optional" : false,
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "feel" : "optional",
+ "group" : "configuration",
+ "binding" : {
+ "name" : "configuration.region",
+ "type" : "zeebe:input"
+ },
+ "type" : "String"
+ }, {
+ "id" : "configuration.endpoint",
+ "label" : "Endpoint",
+ "description" : "Specify endpoint if need to use custom endpoint",
+ "optional" : true,
+ "group" : "configuration",
+ "binding" : {
+ "name" : "configuration.endpoint",
+ "type" : "zeebe:input"
+ },
+ "type" : "Hidden"
+ }, {
+ "id" : "input.executionType",
+ "label" : "Execution type",
+ "description" : "Endpoint inference type",
+ "optional" : false,
+ "value" : "ASYNC",
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "group" : "input",
+ "binding" : {
+ "name" : "input.executionType",
+ "type" : "zeebe:input"
+ },
+ "type" : "Dropdown",
+ "choices" : [ {
+ "name" : "Asynchronous",
+ "value" : "ASYNC"
+ }, {
+ "name" : "Real-time",
+ "value" : "SYNC"
+ }, {
+ "name" : "Polling",
+ "value" : "POLLING"
+ } ]
+ }, {
+ "id" : "input.documentS3Bucket",
+ "label" : "Document bucket",
+ "description" : "S3 bucket that contains document that needs to be processed",
+ "optional" : false,
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.documentS3Bucket",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "input.executionType",
+ "equals" : "SYNC",
+ "type" : "simple"
+ },
+ "type" : "String"
+ }, {
+ "id" : "input.documentName",
+ "label" : "Document path",
+ "description" : "S3 document path to be processed",
+ "optional" : false,
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.documentName",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "input.executionType",
+ "equals" : "SYNC",
+ "type" : "simple"
+ },
+ "type" : "String"
+ }, {
+ "id" : "input.documentVersion",
+ "label" : "Document version",
+ "description" : "S3 document version to be processed",
+ "optional" : true,
+ "feel" : "optional",
+ "group" : "input",
+ "binding" : {
+ "name" : "input.documentVersion",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "input.executionType",
+ "equals" : "SYNC",
+ "type" : "simple"
+ },
+ "type" : "String"
+ }, {
+ "id" : "input.analyzeTables",
+ "label" : "Analyze tables",
+ "description" : "TODO",
+ "optional" : false,
+ "value" : "YES",
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "group" : "input",
+ "binding" : {
+ "name" : "input.analyzeTables",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "input.executionType",
+ "equals" : "SYNC",
+ "type" : "simple"
+ },
+ "type" : "Dropdown",
+ "choices" : [ {
+ "name" : "Yes",
+ "value" : "YES"
+ }, {
+ "name" : "No",
+ "value" : "NO"
+ } ]
+ }, {
+ "id" : "input.analyzeForms",
+ "label" : "Analyze form",
+ "description" : "TODO",
+ "optional" : false,
+ "value" : "YES",
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "group" : "input",
+ "binding" : {
+ "name" : "input.analyzeForms",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "input.executionType",
+ "equals" : "SYNC",
+ "type" : "simple"
+ },
+ "type" : "Dropdown",
+ "choices" : [ {
+ "name" : "Yes",
+ "value" : "YES"
+ }, {
+ "name" : "No",
+ "value" : "NO"
+ } ]
+ }, {
+ "id" : "input.analyzeQueries",
+ "label" : "Analyze queries",
+ "description" : "TODO",
+ "optional" : false,
+ "value" : "YES",
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "group" : "input",
+ "binding" : {
+ "name" : "input.analyzeQueries",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "input.executionType",
+ "equals" : "SYNC",
+ "type" : "simple"
+ },
+ "type" : "Dropdown",
+ "choices" : [ {
+ "name" : "Yes",
+ "value" : "YES"
+ }, {
+ "name" : "No",
+ "value" : "NO"
+ } ]
+ }, {
+ "id" : "input.analyzeSignatures",
+ "label" : "Analyze signatures",
+ "description" : "TODO",
+ "optional" : false,
+ "value" : "YES",
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "group" : "input",
+ "binding" : {
+ "name" : "input.analyzeSignatures",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "input.executionType",
+ "equals" : "SYNC",
+ "type" : "simple"
+ },
+ "type" : "Dropdown",
+ "choices" : [ {
+ "name" : "Yes",
+ "value" : "YES"
+ }, {
+ "name" : "No",
+ "value" : "NO"
+ } ]
+ }, {
+ "id" : "input.analyzeLayout",
+ "label" : "Analyze layout",
+ "description" : "TODO",
+ "optional" : false,
+ "value" : "YES",
+ "constraints" : {
+ "notEmpty" : true
+ },
+ "group" : "input",
+ "binding" : {
+ "name" : "input.analyzeLayout",
+ "type" : "zeebe:input"
+ },
+ "condition" : {
+ "property" : "input.executionType",
+ "equals" : "SYNC",
+ "type" : "simple"
+ },
+ "type" : "Dropdown",
+ "choices" : [ {
+ "name" : "Yes",
+ "value" : "YES"
+ }, {
+ "name" : "No",
+ "value" : "NO"
+ } ]
+ }, {
+ "id" : "resultVariable",
+ "label" : "Result variable",
+ "description" : "Name of variable to store the response in",
+ "group" : "output",
+ "binding" : {
+ "key" : "resultVariable",
+ "type" : "zeebe:taskHeader"
+ },
+ "type" : "String"
+ }, {
+ "id" : "resultExpression",
+ "label" : "Result expression",
+ "description" : "Expression to map the response into process variables",
+ "feel" : "required",
+ "group" : "output",
+ "binding" : {
+ "key" : "resultExpression",
+ "type" : "zeebe:taskHeader"
+ },
+ "type" : "Text"
+ }, {
+ "id" : "errorExpression",
+ "label" : "Error expression",
+ "description" : "Expression to handle errors. Details in the documentation.",
+ "feel" : "required",
+ "group" : "error",
+ "binding" : {
+ "key" : "errorExpression",
+ "type" : "zeebe:taskHeader"
+ },
+ "type" : "Text"
+ }, {
+ "id" : "retryCount",
+ "label" : "Retries",
+ "description" : "Number of retries",
+ "value" : "3",
+ "feel" : "optional",
+ "group" : "retries",
+ "binding" : {
+ "property" : "retries",
+ "type" : "zeebe:taskDefinition"
+ },
+ "type" : "String"
+ }, {
+ "id" : "retryBackoff",
+ "label" : "Retry backoff",
+ "description" : "ISO-8601 duration to wait between retries",
+ "value" : "PT0S",
+ "feel" : "optional",
+ "group" : "retries",
+ "binding" : {
+ "key" : "retryBackoff",
+ "type" : "zeebe:taskHeader"
+ },
+ "type" : "String"
+ } ],
+ "icon" : {
+ "contents" : "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iODBweCIgaGVpZ2h0PSI4MHB4IiB2aWV3Qm94PSIwIDAgODAgODAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+SWNvbi1BcmNoaXRlY3R1cmUvNjQvQXJjaF9BbWF6b24tVGV4dHJhY3RfNjQ8L3RpdGxlPgogICAgPGcgaWQ9Ikljb24tQXJjaGl0ZWN0dXJlLzY0L0FyY2hfQW1hem9uLVRleHRyYWN0XzY0IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iSWNvbi1BcmNoaXRlY3R1cmUtQkcvNjQvTWFjaGluZS1MZWFybmluZyIgZmlsbD0iIzk5NjlmNyI+CiAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUiIHg9IjAiIHk9IjAiIHdpZHRoPSI4MCIgaGVpZ2h0PSI4MCI+PC9yZWN0PgogICAgICAgIDwvZz4KICAgICAgICA8cGF0aCBkPSJNMjIuMDYyNDEwMiw1MCBDMjQuMzc2Mzg5NSw1My42MDMgMjguNDEwMzUzNSw1NiAzMy4wMDAzMTI1LDU2IEM0MC4xNjcyNDg1LDU2IDQ1Ljk5OTE5NjQsNTAuMTY4IDQ1Ljk5OTE5NjQsNDMgQzQ1Ljk5OTE5NjQsMzUuODMyIDQwLjE2NzI0ODUsMzAgMzMuMDAwMzEyNSwzMCBDMjcuNjAzMzYwNywzMCAyMi45NjY0MDIxLDMzLjMwNyAyMS4wMDI0MTk2LDM4IEwyMy4yMTQzOTk5LDM4IEMyNS4wMzkzODM2LDM0LjQ0NCAyOC43MzYzNTA2LDMyIDMzLjAwMDMxMjUsMzIgQzM5LjA2NTI1ODMsMzIgNDMuOTk5MjE0MywzNi45MzUgNDMuOTk5MjE0Myw0MyBDNDMuOTk5MjE0Myw0OS4wNjUgMzkuMDY1MjU4Myw1NCAzMy4wMDAzMTI1LDU0IEMyOS41OTEzNDI5LDU0IDI2LjU0MTM3MDIsNTIuNDQxIDI0LjUyMTM4ODIsNTAgTDIyLjA2MjQxMDIsNTAgWiBNMzcuMDAwMjc2OCw0NSBMMzcuMDAwMjc2OCw0MyBMNDEuOTk5MjMyMSw0MyBDNDEuOTk5MjMyMSwzOC4wMzggMzcuOTYyMjY4MiwzNCAzMy4wMDAzMTI1LDM0IEMyOC4wMzczNTY4LDM0IDIzLjk5OTM5MjksMzguMDM4IDIzLjk5OTM5MjksNDMgTDI4Ljk5OTM0ODIsNDMgTDI4Ljk5OTM0ODIsNDUgTDI0LjIzMTM5MDgsNDUgQzI1LjE0NDM4MjYsNDkuMDAyIDI4LjcyNTM1MDcsNTIgMzMuMDAwMzEyNSw1MiBDMzUuMTM2MjkzNCw1MiAzNy4wOTkyNzU5LDUxLjI0OSAzOC42NDQyNjIxLDUwIEwzNC4wMDAzMDM2LDUwIEwzNC4wMDAzMDM2LDQ4IEw0MC40NzgyNDU3LDQ4IEM0MS4wODEyNDAzLDQ3LjEwMiA0MS41MjAyMzY0LDQ2LjA4NyA0MS43NjgyMzQyLDQ1IEwzNy4wMDAyNzY4LDQ1IFogTTIxLjAwMjQxOTYsNDggTDIzLjIxNDM5OTksNDggQzIyLjQ0MzQwNjgsNDYuNDk4IDIyLjAwMDQxMDcsNDQuODAxIDIyLjAwMDQxMDcsNDMgQzIyLjAwMDQxMDcsNDEuOTU5IDIyLjE1NTQwOTMsNDAuOTU1IDIyLjQyNjQwNjksNDAgTDIwLjM2MzQyNTMsNDAgQzIwLjEzNDQyNzQsNDAuOTY1IDE5Ljk5OTQyODYsNDEuOTY2IDE5Ljk5OTQyODYsNDMgQzE5Ljk5OTQyODYsNDQuNzcxIDIwLjM1ODQyNTQsNDYuNDYgMjEuMDAyNDE5Niw0OCBMMjEuMDAyNDE5Niw0OCBaIE0xOS43NDM0MzA5LDUwIEwxNy4wMDA0NTU0LDUwIEwxNy4wMDA0NTU0LDQ4IEwxOC44NzQ0Mzg2LDQ4IEMxOC41MzQ0NDE3LDQ3LjA0IDE4LjI4OTQ0MzgsNDYuMDM4IDE4LjE0OTQ0NTEsNDUgTDE1LjQxNDQ2OTUsNDUgTDE2LjcwNzQ1OCw0Ni4yOTMgTDE1LjI5MjQ3MDYsNDcuNzA3IEwxMi4yOTI0OTc0LDQ0LjcwNyBDMTEuOTAyNTAwOSw0NC4zMTYgMTEuOTAyNTAwOSw0My42ODQgMTIuMjkyNDk3NCw0My4yOTMgTDE1LjI5MjQ3MDYsNDAuMjkzIEwxNi43MDc0NTgsNDEuNzA3IEwxNS40MTQ0Njk1LDQzIEwxOC4wMDA0NDY0LDQzIEMxOC4wMDA0NDY0LDQxLjk3MyAxOC4xMDQ0NDU1LDQwLjk3IDE4LjMwMjQ0MzcsNDAgTDE3LjAwMDQ1NTQsNDAgTDE3LjAwMDQ1NTQsMzggTDE4Ljg3NDQzODYsMzggQzIwLjk0MDQyMDIsMzIuMTg0IDI2LjQ4MzM3MDcsMjggMzMuMDAwMzEyNSwyOCBDMzcuNDI3MjczLDI4IDQxLjQwMDIzNzUsMjkuOTM5IDQ0LjE0ODIxMywzMyBMNTkuMDAwMDgwNCwzMyBMNTkuMDAwMDgwNCwzNSBMNDUuNjY2MTk5NCwzNSBDNDcuMTM1MTg2MywzNy4zMTggNDcuOTk5MTc4Niw0MC4wNTggNDcuOTk5MTc4Niw0MyBMNTkuMDAwMDgwNCw0MyBMNTkuMDAwMDgwNCw0NSBMNDcuODUwMTc5OSw0NSBDNDYuODY4MTg4Nyw1Mi4zMjcgNDAuNTkxMjQ0Nyw1OCAzMy4wMDAzMTI1LDU4IEMyNy4yNTYzNjM4LDU4IDIyLjI2MjQwODQsNTQuNzUyIDE5Ljc0MzQzMDksNTAgTDE5Ljc0MzQzMDksNTAgWiBNMzcuMDAwMjc2OCwzOSBDMzcuMDAwMjc2OCwzOC40NDggMzYuNTUyMjgwOCwzOCAzNi4wMDAyODU3LDM4IEwyOS45OTkzNDgyLDM4IEMyOS40NDczNDQyLDM4IDI4Ljk5OTM0ODIsMzguNDQ4IDI4Ljk5OTM0ODIsMzkgTDI4Ljk5OTM0ODIsNDEgTDMxLjAwMDMzMDQsNDEgTDMxLjAwMDMzMDQsNDAgTDMyLjAwMDMyMTQsNDAgTDMyLjAwMDMyMTQsNDMgTDMxLjAwMDMzMDQsNDMgTDMxLjAwMDMzMDQsNDUgTDM1LjAwMDI5NDYsNDUgTDM1LjAwMDI5NDYsNDMgTDM0LjAwMDMwMzYsNDMgTDM0LjAwMDMwMzYsNDAgTDM1LjAwMDI5NDYsNDAgTDM1LjAwMDI5NDYsNDEgTDM3LjAwMDI3NjgsNDEgTDM3LjAwMDI3NjgsMzkgWiBNNDkuMDAwMTY5Niw0MCBMNTkuMDAwMDgwNCw0MCBMNTkuMDAwMDgwNCwzOCBMNDkuMDAwMTY5NiwzOCBMNDkuMDAwMTY5Niw0MCBaIE00OS4wMDAxNjk2LDUwIEw1OS4wMDAwODA0LDUwIEw1OS4wMDAwODA0LDQ4IEw0OS4wMDAxNjk2LDQ4IEw0OS4wMDAxNjk2LDUwIFogTTU3LjAwMDA5ODIsMjcgTDYwLjU4NTA2NjIsMjcgTDU3LjAwMDA5ODIsMjMuNDE0IEw1Ny4wMDAwOTgyLDI3IFogTTYzLjcwNzAzODMsMjcuMjkzIEM2My44OTQwMzY3LDI3LjQ4IDY0LjAwMDAzNTcsMjcuNzM1IDY0LjAwMDAzNTcsMjggTDY0LjAwMDAzNTcsNjMgQzY0LjAwMDAzNTcsNjMuNTUyIDYzLjU1MjAzOTcsNjQgNjMuMDAwMDQ0Niw2NCBMMzIuMDAwMzMwNCw2NCBDMzEuNDQ3MzI2NCw2NCAzMS4wMDAzMzA0LDYzLjU1MiAzMS4wMDAzMzA0LDYzIEwzMS4wMDAzMzA0LDU5IEwzMy4wMDAzMTI1LDU5IEwzMy4wMDAzMTI1LDYyIEw2Mi4wMDAwNTM2LDYyIEw2Mi4wMDAwNTM2LDI5IEw1Ni4wMDAxMDcxLDI5IEM1NS40NDcxMTIxLDI5IDU1LjAwMDExNjEsMjguNTUyIDU1LjAwMDExNjEsMjggTDU1LjAwMDExNjEsMjIgTDMzLjAwMDMxMjUsMjIgTDMzLjAwMDMxMjUsMjcgTDMxLjAwMDMzMDQsMjcgTDMxLjAwMDMzMDQsMjEgQzMxLjAwMDMzMDQsMjAuNDQ4IDMxLjQ0NzMyNjQsMjAgMzIuMDAwMzMwNCwyMCBMNTYuMDAwMTA3MSwyMCBDNTYuMjY1MTA0OCwyMCA1Ni41MTkxMDI1LDIwLjEwNSA1Ni43MDcxMDA4LDIwLjI5MyBMNjMuNzA3MDM4MywyNy4yOTMgWiBNNjgsMjQuMTY2IEw2OCw2MSBDNjgsNjEuNTUyIDY3LjU1MjAwNCw2MiA2Ny4wMDAwMDg5LDYyIEw2NS4wMDAwMjY4LDYyIEw2NS4wMDAwMjY4LDYwIEw2Ni4wMDAwMTc5LDYwIEw2Ni4wMDAwMTc5LDI0LjYxMiBMNTguNjE3MDgzOCwxOCBMMzYuMDAwMjg1NywxOCBMMzYuMDAwMjg1NywxOSBMMzQuMDAwMzAzNiwxOSBMMzQuMDAwMzAzNiwxNyBDMzQuMDAwMzAzNiwxNi40NDggMzQuNDQ3Mjk5NiwxNiAzNS4wMDAzMDM2LDE2IEw1OS4wMDAwODA0LDE2IEM1OS4yNDYwNzgyLDE2IDU5LjQ4MzA3NiwxNi4wOTEgNTkuNjY2MDc0NCwxNi4yNTUgTDY3LjY2NjAwMywyMy40MiBDNjcuODc4MDAxMSwyMy42MSA2OCwyMy44ODEgNjgsMjQuMTY2IEw2OCwyNC4xNjYgWiIgaWQ9IkFtYXpvbi1UZXh0cmFjdF9JY29uXzY0X1NxdWlkIiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg=="
+ }
+}
\ No newline at end of file
diff --git a/connectors/aws/aws-textract/pom.xml b/connectors/aws/aws-textract/pom.xml
new file mode 100644
index 0000000000..e22bd6a8c3
--- /dev/null
+++ b/connectors/aws/aws-textract/pom.xml
@@ -0,0 +1,78 @@
+
+ 4.0.0
+
+
+ io.camunda.connector
+ connector-aws-parent
+ 8.6.0-SNAPSHOT
+ ../pom.xml
+
+
+ connector-aws-textract
+ Camunda AWS Textract Connector
+ connector-aws-textract
+ jar
+
+
+
+ Camunda Self-Managed Free Edition license
+ https://camunda.com/legal/terms/cloud-terms-and-conditions/camunda-cloud-self-managed-free-edition-terms/
+
+
+ Camunda Self-Managed Enterprise Edition license
+
+
+
+
+ Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH
+ under one or more contributor license agreements. Licensed under a proprietary license.
+ See the License.txt file for more information. You may not use this file
+ except in compliance with the proprietary license.
+
+
+
+
+ io.camunda.connector
+ connector-aws-base
+ ${project.version}
+
+
+
+ com.amazonaws
+ aws-java-sdk-textract
+ ${version.aws-java-sdk}
+
+
+
+
+
+
+
+ io.camunda.connector
+ element-template-generator-maven-plugin
+ ${project.version}
+
+
+
+ io.camunda.connector.textract.TextractConnectorFunction
+
+
+ io.camunda.connectors.AWSTEXTRACT.v1
+ aws-textract-outbound-connector.json
+
+
+ true
+
+
+
+ io.camunda.connector:connector-aws-base
+
+
+
+
+
+
+
+
+
diff --git a/connectors/aws/aws-textract/src/main/java/io/camunda/connector/textract/TextractConnectorFunction.java b/connectors/aws/aws-textract/src/main/java/io/camunda/connector/textract/TextractConnectorFunction.java
new file mode 100644
index 0000000000..1709338456
--- /dev/null
+++ b/connectors/aws/aws-textract/src/main/java/io/camunda/connector/textract/TextractConnectorFunction.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH
+ * under one or more contributor license agreements. Licensed under a proprietary license.
+ * See the License.txt file for more information. You may not use this file
+ * except in compliance with the proprietary license.
+ */
+package io.camunda.connector.textract;
+
+import io.camunda.connector.api.annotation.OutboundConnector;
+import io.camunda.connector.api.outbound.OutboundConnectorContext;
+import io.camunda.connector.api.outbound.OutboundConnectorFunction;
+import io.camunda.connector.generator.java.annotation.ElementTemplate;
+import io.camunda.connector.textract.model.TextractRequest;
+
+@OutboundConnector(
+ name = "AWS Textract",
+ inputVariables = {"authentication", "configuration", "input"},
+ type = "io.camunda:aws-textract:1")
+@ElementTemplate(
+ id = "io.camunda.connectors.AWSTEXTRACT.v1",
+ name = "AWS Textract Outbound Connector",
+ description =
+ "Automatically extract printed text, handwriting, layout elements, and data from any document",
+ inputDataClass = TextractRequest.class,
+ version = 1,
+ propertyGroups = {
+ @ElementTemplate.PropertyGroup(id = "authentication", label = "Authentication"),
+ @ElementTemplate.PropertyGroup(id = "configuration", label = "Configuration"),
+ @ElementTemplate.PropertyGroup(id = "input", label = "Configure input")
+ },
+ documentationRef =
+ "https://docs.camunda.io/docs/next/components/connectors/out-of-the-box-connectors/amazon-textract/",
+ icon = "icon.svg")
+public class TextractConnectorFunction implements OutboundConnectorFunction {
+
+ @Override
+ public Object execute(OutboundConnectorContext context) throws Exception {
+ return null;
+ }
+}
diff --git a/connectors/aws/aws-textract/src/main/java/io/camunda/connector/textract/model/TextractExecutionType.java b/connectors/aws/aws-textract/src/main/java/io/camunda/connector/textract/model/TextractExecutionType.java
new file mode 100644
index 0000000000..62910a555b
--- /dev/null
+++ b/connectors/aws/aws-textract/src/main/java/io/camunda/connector/textract/model/TextractExecutionType.java
@@ -0,0 +1,13 @@
+/*
+ * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH
+ * under one or more contributor license agreements. Licensed under a proprietary license.
+ * See the License.txt file for more information. You may not use this file
+ * except in compliance with the proprietary license.
+ */
+package io.camunda.connector.textract.model;
+
+public enum TextractExecutionType {
+ SYNC,
+ POLLING,
+ ASYNC
+}
diff --git a/connectors/aws/aws-textract/src/main/java/io/camunda/connector/textract/model/TextractRequest.java b/connectors/aws/aws-textract/src/main/java/io/camunda/connector/textract/model/TextractRequest.java
new file mode 100644
index 0000000000..9e0c9a0112
--- /dev/null
+++ b/connectors/aws/aws-textract/src/main/java/io/camunda/connector/textract/model/TextractRequest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH
+ * under one or more contributor license agreements. Licensed under a proprietary license.
+ * See the License.txt file for more information. You may not use this file
+ * except in compliance with the proprietary license.
+ */
+package io.camunda.connector.textract.model;
+
+import io.camunda.connector.aws.model.impl.AwsBaseRequest;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+
+public class TextractRequest extends AwsBaseRequest {
+ @Valid @NotNull private TextractRequestData input;
+
+ public TextractRequestData getInput() {
+ return input;
+ }
+
+ public void setInput(TextractRequestData input) {
+ this.input = input;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ TextractRequest that = (TextractRequest) o;
+
+ return new EqualsBuilder().appendSuper(super.equals(o)).append(input, that.input).isEquals();
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder(17, 37).appendSuper(super.hashCode()).append(input).toHashCode();
+ }
+
+ @Override
+ public String toString() {
+ return "TextractRequest{" + "input=" + input + '}';
+ }
+}
diff --git a/connectors/aws/aws-textract/src/main/java/io/camunda/connector/textract/model/TextractRequestData.java b/connectors/aws/aws-textract/src/main/java/io/camunda/connector/textract/model/TextractRequestData.java
new file mode 100644
index 0000000000..234e23216c
--- /dev/null
+++ b/connectors/aws/aws-textract/src/main/java/io/camunda/connector/textract/model/TextractRequestData.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH
+ * under one or more contributor license agreements. Licensed under a proprietary license.
+ * See the License.txt file for more information. You may not use this file
+ * except in compliance with the proprietary license.
+ */
+package io.camunda.connector.textract.model;
+
+import io.camunda.connector.generator.dsl.Property.FeelMode;
+import io.camunda.connector.generator.java.annotation.TemplateProperty;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+
+public record TextractRequestData(
+ @TemplateProperty(
+ label = "Execution type",
+ group = "input",
+ type = TemplateProperty.PropertyType.Dropdown,
+ defaultValue = "ASYNC",
+ feel = FeelMode.disabled,
+ choices = {
+ @TemplateProperty.DropdownPropertyChoice(value = "ASYNC", label = "Asynchronous"),
+ @TemplateProperty.DropdownPropertyChoice(value = "SYNC", label = "Real-time"),
+ @TemplateProperty.DropdownPropertyChoice(value = "POLLING", label = "Polling")
+ },
+ description = "Endpoint inference type")
+ @NotNull
+ TextractExecutionType executionType,
+ @TemplateProperty(
+ group = "input",
+ label = "Document bucket",
+ description = "S3 bucket that contains document that needs to be processed")
+ @NotBlank
+ String documentS3Bucket,
+ @TemplateProperty(
+ group = "input",
+ label = "Document path",
+ description = "S3 document path to be processed")
+ @NotBlank
+ String documentName,
+ @TemplateProperty(
+ group = "input",
+ label = "Document version",
+ description = "S3 document version to be processed",
+ optional = true)
+ String documentVersion,
+ @TemplateProperty(
+ label = "Analyze tables",
+ group = "input",
+ type = TemplateProperty.PropertyType.Boolean,
+ defaultValueType = TemplateProperty.DefaultValueType.Boolean,
+ defaultValue = "true")
+ @NotNull
+ boolean analyzeTables,
+ @TemplateProperty(
+ label = "Analyze form",
+ group = "input",
+ type = TemplateProperty.PropertyType.Boolean,
+ defaultValueType = TemplateProperty.DefaultValueType.Boolean,
+ defaultValue = "true")
+ @NotNull
+ boolean analyzeForms,
+ @TemplateProperty(
+ label = "Analyze signatures",
+ group = "input",
+ type = TemplateProperty.PropertyType.Boolean,
+ defaultValueType = TemplateProperty.DefaultValueType.Boolean,
+ defaultValue = "true")
+ @NotNull
+ boolean analyzeSignatures,
+ @TemplateProperty(
+ label = "Analyze layout",
+ group = "input",
+ type = TemplateProperty.PropertyType.Boolean,
+ defaultValueType = TemplateProperty.DefaultValueType.Boolean,
+ defaultValue = "true")
+ @NotNull
+ boolean analyzeLayout,
+ @TemplateProperty(
+ group = "input",
+ label = "Client request token",
+ description = "The idempotent token that you use to identify the start request",
+ optional = true,
+ condition =
+ @TemplateProperty.PropertyCondition(
+ property = "input.executionType",
+ equals = "ASYNC"))
+ String clientRequestToken,
+ @TemplateProperty(
+ group = "input",
+ label = "Job tag",
+ description =
+ "An identifier that you specify that's included in the completion notification published to the Amazon SNS topic",
+ optional = true,
+ condition =
+ @TemplateProperty.PropertyCondition(
+ property = "input.executionType",
+ equals = "ASYNC"))
+ String jobTag,
+ @TemplateProperty(
+ group = "input",
+ label = "KMS key ID",
+ description = "The KMS key used to encrypt the inference results",
+ optional = true,
+ condition =
+ @TemplateProperty.PropertyCondition(
+ property = "input.executionType",
+ equals = "ASYNC"))
+ String kmsKeyId,
+ @TemplateProperty(
+ group = "input",
+ label = "Notification channel role ARN",
+ description =
+ "The Amazon SNS topic role ARN that you want Amazon Textract to publish the completion status of the operation to",
+ optional = true,
+ condition =
+ @TemplateProperty.PropertyCondition(
+ property = "input.executionType",
+ equals = "ASYNC"))
+ String notificationChannelRoleArn,
+ @TemplateProperty(
+ group = "input",
+ label = "Notification channel SNS topic ARN",
+ description =
+ "The Amazon SNS topic ARN that you want Amazon Textract to publish the completion status of the operation to",
+ optional = true,
+ condition =
+ @TemplateProperty.PropertyCondition(
+ property = "input.executionType",
+ equals = "ASYNC"))
+ String notificationChannelSnsTopicArn,
+ @TemplateProperty(
+ group = "input",
+ label = "Output S3 bucket",
+ description = "The name of the bucket your output will go to",
+ optional = true,
+ condition =
+ @TemplateProperty.PropertyCondition(
+ property = "input.executionType",
+ equals = "ASYNC"))
+ String outputConfigS3Bucket,
+ @TemplateProperty(
+ group = "input",
+ label = "Output S3 prefix",
+ description = "The prefix of the object key that the output will be saved to",
+ optional = true,
+ condition =
+ @TemplateProperty.PropertyCondition(
+ property = "input.executionType",
+ equals = "ASYNC"))
+ String outputConfigS3Prefix) {}
diff --git a/connectors/aws/aws-textract/src/main/resources/META-INF/services/io.camunda.connector.api.outbound.OutboundConnectorFunction b/connectors/aws/aws-textract/src/main/resources/META-INF/services/io.camunda.connector.api.outbound.OutboundConnectorFunction
new file mode 100644
index 0000000000..09eafaba71
--- /dev/null
+++ b/connectors/aws/aws-textract/src/main/resources/META-INF/services/io.camunda.connector.api.outbound.OutboundConnectorFunction
@@ -0,0 +1 @@
+io.camunda.connector.textract.TextractConnectorFunction
\ No newline at end of file
diff --git a/connectors/aws/aws-textract/src/main/resources/icon.svg b/connectors/aws/aws-textract/src/main/resources/icon.svg
new file mode 100644
index 0000000000..8fba004b73
--- /dev/null
+++ b/connectors/aws/aws-textract/src/main/resources/icon.svg
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/connectors/aws/pom.xml b/connectors/aws/pom.xml
index 461acc64d6..ad684345de 100644
--- a/connectors/aws/pom.xml
+++ b/connectors/aws/pom.xml
@@ -25,6 +25,7 @@
aws-sqs
aws-sagemaker
aws-bedrock
+ aws-textract