Back to skills
SkillHub ClubShip Full StackFull StackBackend

workato-sdk-reference

This skill should be used when the user asks about "sdk reference", "actions block reference", "triggers block reference", "object_definitions", "methods block", "pick_lists", "schema block", "http methods workato", "ruby methods workato", or needs API reference documentation for Workato SDK blocks and methods.

Packaged view

This page reorganizes the original catalog entry around fit, installability, and workflow context first. The original raw source lives below.

Stars
0
Hot score
74
Updated
March 20, 2026
Overall rating
C0.0
Composite score
0.0
Best-practice grade
C60.3

Install command

npx @skill-hub/cli install grailautomation-claude-plugins-workato-sdk-reference

Repository

grailautomation/claude-plugins

Skill path: workato-sdk/skills/workato-sdk-reference

This skill should be used when the user asks about "sdk reference", "actions block reference", "triggers block reference", "object_definitions", "methods block", "pick_lists", "schema block", "http methods workato", "ruby methods workato", or needs API reference documentation for Workato SDK blocks and methods.

Open repository

Best for

Primary workflow: Ship Full Stack.

Technical facets: Full Stack, Backend.

Target audience: everyone.

License: Unknown.

Original source

Catalog source: SkillHub Club.

Repository owner: grailautomation.

This is still a mirrored public skill entry. Review the repository before installing into production workflows.

What it helps with

  • Install workato-sdk-reference into Claude Code, Codex CLI, Gemini CLI, or OpenCode workflows
  • Review https://github.com/grailautomation/claude-plugins before adding workato-sdk-reference to shared team environments
  • Use workato-sdk-reference for development workflows

Works across

Claude CodeCodex CLIGemini CLIOpenCode

Favorites: 0.

Sub-skills: 0.

Aggregator: No.

Original source / Raw SKILL.md

---
name: workato-sdk-reference
description: This skill should be used when the user asks about "sdk reference", "actions block reference", "triggers block reference", "object_definitions", "methods block", "pick_lists", "schema block", "http methods workato", "ruby methods workato", or needs API reference documentation for Workato SDK blocks and methods.
version: 0.1.0
---

# Workato SDK Reference

Comprehensive reference for all Workato Connector SDK blocks, methods, and configuration options.

## Overview

The Workato SDK consists of these main blocks:

| Block | Purpose |
|-------|---------|
| `connection` | Authentication and base configuration |
| `actions` | Operations users can perform |
| `triggers` | Events that start recipes |
| `methods` | Reusable helper functions |
| `object_definitions` | Reusable schema definitions |
| `pick_lists` | Dropdown options |
| `streams` | Large file handling |

## Connection Block

Defines authentication and connection settings.

```ruby
connection: {
  fields: Array,           # Credential input fields
  authorization: Hash,     # Auth type and configuration
  base_uri: lambda,        # Base URL for requests
  test: lambda            # Connection test
}
```

### Authorization Types

| Type | Use Case |
|------|----------|
| `basic_auth` | Username/password |
| `api_key` | API key in header/query |
| `oauth2` | OAuth 2.0 flows |
| `custom_auth` | Custom auth logic |
| `multi` | Multiple auth options |
| `aws_auth` | AWS Signature v4 |

## Actions Block

Defines connector operations.

```ruby
actions: {
  action_name: {
    title: String,                    # Display name
    subtitle: String,                 # Secondary description
    description: lambda,              # Dynamic description
    help: String | lambda,            # Help text
    config_fields: Array,             # Mode selectors
    input_fields: lambda,             # Input schema
    execute: lambda,                  # Main logic
    output_fields: lambda,            # Output schema
    sample_output: lambda,            # Sample data
    retry_on_response: Array,         # HTTP codes to retry
    retry_on_request: Array,          # Errors to retry
    max_retries: Integer,             # Retry count
    summarize_input: Array,           # Input summary fields
    summarize_output: Array           # Output summary fields
  }
}
```

### Execute Lambda Parameters

```ruby
execute: lambda do |connection, input, extended_input_schema, extended_output_schema, continue|
  # connection - credentials hash
  # input - user inputs
  # extended_input_schema - dynamic schema info
  # extended_output_schema - dynamic output schema
  # continue - multistep continuation data
end
```

## Triggers Block

Defines event triggers.

```ruby
triggers: {
  trigger_name: {
    title: String,
    description: lambda,
    config_fields: Array,
    input_fields: lambda,
    poll: lambda,                     # Polling logic
    webhook_subscribe: lambda,        # Webhook registration
    webhook_unsubscribe: lambda,      # Webhook cleanup
    webhook_notification: lambda,     # Webhook handler
    dedup: lambda,                    # Deduplication
    output_fields: lambda,
    sample_output: lambda
  }
}
```

### Poll Lambda Returns

```ruby
poll: lambda do |connection, input, closure|
  {
    events: Array,          # Records to process
    next_poll: Any,         # Stored in closure
    can_poll_more: Boolean  # Continue polling?
  }
end
```

## Methods Block

Reusable helper functions.

```ruby
methods: {
  method_name: lambda do |arg1, arg2|
    # Logic here
  end
}
```

### Calling Methods

```ruby
result = call('method_name', arg1, arg2)
```

## Object Definitions Block

Reusable field schemas.

```ruby
object_definitions: {
  schema_name: {
    fields: lambda do |connection, config_fields, object_definitions|
      [
        { name: 'field_name', label: 'Label', type: 'string' }
      ]
    end
  }
}
```

### Referencing Object Definitions

```ruby
input_fields: lambda do |object_definitions|
  object_definitions['schema_name']
end
```

## Pick Lists Block

Dropdown options.

```ruby
pick_lists: {
  # Static list
  statuses: lambda do
    [
      ['Active', 'active'],
      ['Inactive', 'inactive']
    ]
  end,

  # Dynamic list
  objects: lambda do |connection|
    get('/api/objects').map { |o| [o['name'], o['id']] }
  end,

  # Dependent list
  fields: lambda do |connection, object_type:|
    get("/api/objects/#{object_type}/fields").map { |f| [f['label'], f['name']] }
  end
}
```

## HTTP Methods

### Request Methods

| Method | Usage |
|--------|-------|
| `get(url)` | GET request |
| `post(url)` | POST request |
| `put(url)` | PUT request |
| `patch(url)` | PATCH request |
| `delete(url)` | DELETE request |

### Request Modifiers

```ruby
get('/api/records')
  .params(key: 'value')              # Query parameters
  .payload(data)                     # Request body
  .headers('X-Custom' => 'value')    # Custom headers
  .request_format_json               # JSON body (default)
  .request_format_xml                # XML body
  .request_format_www_form_urlencoded # Form body
  .request_format_multipart_form     # Multipart body
  .response_format_json              # Parse JSON (default)
  .response_format_xml               # Parse XML
  .response_format_raw               # Raw response
```

### Error Handling

```ruby
get('/api/records')
  .after_response do |code, body, headers|
    # Handle any response
  end
  .after_error_response(400) do |code, body, headers, message|
    # Handle specific error
  end
  .after_error_response(/4\d{2}/) do |code, body, headers, message|
    # Handle error pattern
  end
```

## Field Schema

### Field Properties

| Property | Type | Description |
|----------|------|-------------|
| `name` | String | Internal field name |
| `label` | String | Display label |
| `type` | String | Data type |
| `control_type` | String | UI control |
| `optional` | Boolean | Required field? |
| `default` | Any | Default value |
| `hint` | String | Help text |
| `sticky` | Boolean | Always visible |
| `extends_schema` | Boolean | Triggers schema refresh |
| `ngIf` | String | Conditional visibility |
| `pick_list` | String | Dropdown source |
| `toggle_field` | Hash | Toggle input |

### Data Types

| Type | Description |
|------|-------------|
| `string` | Text (default) |
| `integer` | Whole numbers |
| `number` | Decimal numbers |
| `boolean` | True/false |
| `date` | Date only |
| `date_time` | Date and time |
| `timestamp` | Unix timestamp |
| `object` | Nested object |
| `array` | List of items |

### Control Types

| Control | Use Case |
|---------|----------|
| `text` | Single line text |
| `text-area` | Multi-line text |
| `select` | Dropdown |
| `multiselect` | Multiple selection |
| `number` | Number input |
| `integer` | Integer input |
| `checkbox` | Boolean toggle |
| `password` | Masked input |
| `date` | Date picker |
| `date_time` | DateTime picker |
| `email` | Email input |
| `url` | URL input |
| `phone` | Phone input |

## Ruby Methods

### Workato-Specific Methods

```ruby
workato.log(message)                    # Debug logging
workato.parse_json(string)              # Parse JSON
workato.parse_xml(string)               # Parse XML
workato.hmac_sha256(data, key)          # HMAC SHA256
workato.jwt_encode(payload, key, alg)   # JWT encoding
workato.uuid                            # Generate UUID
workato.trigger_limit                   # Current trigger limit
workato.resume_url                      # Wait-for-resume URL
workato.stream.in(data)                 # Stream input
workato.stream.out(name, input)         # Stream output
```

### Allowed Ruby Methods

Common Ruby methods available in SDK:
- String: `split`, `gsub`, `match`, `strip`, `upcase`, `downcase`
- Array: `map`, `select`, `reject`, `find`, `first`, `last`, `flatten`
- Hash: `dig`, `merge`, `slice`, `except`, `each`, `keys`, `values`
- Time: `now`, `parse`, `iso8601`, `strftime`
- Integer: `to_s`, `to_i`, `abs`, `times`

## Reference Files

For complete documentation:

### Core References
- **`references/sdk-reference.md`** - SDK overview
- **`references/sdk-reference__actions.md`** - Actions reference
- **`references/sdk-reference__triggers.md`** - Triggers reference
- **`references/sdk-reference__connection.md`** - Connection reference
- **`references/sdk-reference__connection__authorization.md`** - Authorization details

### Schema & Methods
- **`references/sdk-reference__schema.md`** - Field schema reference
- **`references/sdk-reference__object_definitions.md`** - Object definitions
- **`references/sdk-reference__methods.md`** - Methods block
- **`references/sdk-reference__picklists.md`** - Pick lists

### HTTP & Utilities
- **`references/sdk-reference__http.md`** - HTTP methods
- **`references/sdk-reference__ruby_methods.md`** - Allowed Ruby methods
- **`references/sdk-reference__streams.md`** - Streaming reference
- **`references/sdk-reference__test.md`** - Testing reference

### Other
- **`references/sdk-reference__custom-action.md`** - Custom action support
- **`references/sdk-reference__whitelist-removal.md`** - Deprecated methods
- **`references/guides.md`** - Guides index


---

## Referenced Files

> The following files are referenced in this skill and included for context.

### references/sdk-reference.md

```markdown
# Workato SDK Documentation

> **Source**: https://docs.workato.com/en/developing-connectors/sdk/sdk-reference.html
> **Fetched**: 2026-01-18T02:50:23.360277

---

# [#](<#sdk-reference>) SDK Reference

This is the full list of all possible attributes that you can include in your Workato connector. This section is organized by the root keys of a connector:

  * `connection` \- Handles all aspects pertaining to how your connector should establish a connection with a target API.
  * `test` \- Works hand in hand with the `connection` key to verify that a connection has been successfully established.
  * `actions` \- Contains the definition of all actions in your connector.
  * `triggers` \- Contains the definition of all triggers in your connector.
  * `object_definitions` \- Define commonly used input or output fields and reference them later on in your actions and triggers.
  * `pick_lists` \- Used to generate drop-downs in input fields.
  * `methods` \- Create reusable methods which can be called from anywhere in your connector.
  * `secure_tunnel` \- Used to created OPA compatible connectors to communicate with on-premise systems.
  * `webhook_keys` \- Used in conjunction with Static webhook triggers.
  * `streams` \- Used in conjunction with actions and triggers to implement file streaming.

In addition to this, the SDK reference also contains the following information regarding

  * Defining input and output fields
  * Using HTTP Methods to send requests
  * Available ruby methods that can be used in your connector code

## [#](<#sample-connector-skeleton>) Sample Connector Skeleton

Each connector in Workato is a big hash that contains the root keys detailed above. Below, we have an example of a summarized connector. Not all keys are required.
```ruby
 
    {
      title: 'My sample connector',

      connection: Hash,

      test: lambda do
        Boolean
      end,

      custom_action: Boolean,

      custom_action_help: Hash,

      actions: Hash,

      triggers: Hash,

      object_definitions: Hash,

      pick_lists: Hash,

      methods: Hash,

      secure_tunnel: Boolean,

      webhook_keys: lambda do
        String
      end,

      streams: Hash
    }


```

```

### references/sdk-reference__actions.md

```markdown
# Workato SDK Documentation

> **Source**: https://docs.workato.com/en/developing-connectors/sdk/sdk-reference/actions.html
> **Fetched**: 2026-01-18T02:50:24.506262

---

# [#](<#sdk-reference-actions>) SDK Reference - `actions`

This section enumerates all the possible keys to define an action.

Quick Overview

The `actions` key can only be used in both recipes and the SDK **Test code** tab after you have created a successful connection. Actions receive data from earlier steps in a recipe via datapills, send a request to an endpoint and present the response as datapills.

## [#](<#structure>) Structure
```ruby
 
        actions: {

          [Unique_action_name]: {
            title: String,

            subtitle: String,

            description: lambda do |input, picklist_label|
              String
            end,

            help: lambda do |input, picklist_label|
              Hash
            end,

            display_priority: Integer,

            batch: Boolean,

            bulk: Boolean,

            deprecated: Boolean,

            config_fields: Array

            input_fields: lambda do |object_definitions, connection, config_fields|
              Array
            end,

            execute: lambda do |connection, input, extended_input_schema, extended_output_schema, continue|
              Hash
            end,

            output_fields: lambda do |object_definitions, connection, config_fields|
              Array
            end,

            sample_output: lambda do |connection, input|
              Hash
            end,

            retry_on_response: Array,

            retry_on_request: Array,

            max_retries: Int,

            summarize_input: Array,

            summarize_output: Array
          },

          [Another_unique_action_name]: {
            ...
          }
        },


```

* * *

## [#](<#title>) `title`

Attribute | Description  
---|---  
Key | `title`  
Type | String  
Required | Optional. Defaults to title built from labeled key.  
Description | This allows you to define the title of your action, which might differ from the name of the key assigned to it - Key = `search_object_query`, title = `"Search object via query"`  
Expected Output | `String`   
i.e. `"Search object via query"`  
UI reference | ![](/assets/img/title.48365f4d.png)  

TIP

In Workato, we generally advise the following structure "[Verb] [Object]" - "Create lead" or "Search object" rather than "Lead created".

* * *

## [#](<#subtitle>) `subtitle`

Attribute | Description  
---|---  
Key | `subtitle`  
Type | String  
Required | Optional. Defaults to subtitle inferred from connector name and action title.  
Description | This allows you to define the subtitle of your action.  
Expected Output | `String`   
i.e. `"Use complex queries to search objects in Percolate"`  
UI reference | ![](/assets/img/subtitle.9fbdfa1b.png)  

TIP

To make your subtitles meaningful, try to provide more information in here whilst keeping your titles concise. For example, your title could be "Create object" whereas your subtitle could be "Create objects like leads, customers, and accounts in Salesforce." When users search for a specific action, Workato also searches for matches in the subtitle.

* * *

## [#](<#description>) `description`

Attribute | Description  
---|---  
Key | `description`  
Type | lambda function  
Required | Optional. Defaults to description inferred from connector name and action title.  
Description | This allows you to define the description of your action when viewed in the recipe editor. This can be a static description or a dynamic one based on your needs.  
Possible Arguments | `input` \- Hash representing user given inputs defined in `input_fields`   
`picklist_label` \- Only applicable for picklists where a user's answer consist of both a picklist label and value. This Hash represents the label for a user's given inputs for picklist fields. See below for use cases.  
Expected Output | `String`   
i.e. `"Create a <span class='provider'>campaign</span> in <span class='provider'>Percolate</span>"` Add the `<span>` HTML tags to add weight to your description text.  
UI reference | ![](data:image/png;base64,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)  
Example - description:

For the `description` lambda function, you have access to two arguments to make your descriptions dynamic. This is useful when you want to change your description based on how a given user has configured the action. These changes can be incredibly useful for your users to ensure they know what this action is doing without having to click and view the action's configuration to understand what it does.
```ruby
 
        create_object: {
          description: lambda do |input, picklist_label|
            "Create a <span class='provider'>#{picklist_label['object'] || 'object'}</span> in " \
            "<span class='provider'>Percolate</span>"
          end,

          config_fields: [
            {
              name: 'object',
              control_type: 'select',
              pick_list: 'object_types',
              optional: false
            }
          ]

          # More keys to define the action
        }


```

In the preceding example, the action is a generic object action that allows the user to choose between multiple object types when configuring the recipe. You can change the description of the object the user selects by referencing the `picklist_label` argument.

![](/assets/img/description-example.52d7ecb5.gif)

* * *

## [#](<#help>) `help`

Attribute | Description  
---|---  
Key | `help`  
Type | lambda function  
Required | Optional. No help is displayed otherwise.  
Description | The help text that is meant to guide your users as to how to configure this action. You can also point them to documentation.  
Possible Arguments | `input` \- Hash representing user given inputs defined in `input_fields`   
`picklist_label` \- Only applicable for picklists where a user's answer consist of both a picklist label and value. This Hash represents the label for a user's given inputs for picklist fields. See below for use cases.  
Expected Output | `Hash` or `String` See below for examples.  
UI reference | ![](data:image/png;base64,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)  
Example - help:

The output of the `help` lambda function can either be a simple String or a Hash. Below we go through the two examples:

  * String

```ruby
 
        help: lambda do |input, picklist_label|
          'Create an object in Percolate. First, select from a list of ' \
          'objects that we currently support. After selecting your object,' \
          ' dynamic input fields specific to your scope and object selected ' \
          'will be populated.' \
          ' Creating an approval denotes submitting a specified piece of content' \
          ' or campaign for a specific approval workflow.'
        end,


```

  * Hash

```ruby
 
        help: lambda do |input, picklist_label|
          {
            body: "First, filter by the object you want then fill up the input fields " \
            "which appear based on the object you have selected. Amongst other things, " \
            "you’ll be able to search for contacts in your company and cloud recordings from the past. ",
            learn_more_url: "https://docs.workato.com/connectors/zoom/event-actions.html#search-event-details",
            learn_more_text: "Learn more"
          }
        end,


```

![](/assets/img/help-example.bdfb4b3c.png)

* * *

## [#](<#display-priority>) `display_priority`

Attribute | Description  
---|---  
Key | `display_priority`  
Type | Integer  
Required | Optional. Defaults to zero, otherwise to the alphabetical ordering of actions titles.  
Description | This allows you to influence the ordering of the action in the recipe editor so that you can highlight top actions. The higher the integer, the higher the priority. If two actions have the same priority, they are ordered by their titles.  

* * *

## [#](<#batch>) `batch`

Attribute | Description  
---|---  
Key | `batch`  
Type | Boolean  
Required | Optional.  
Description | This presents a "Batch" tag next to your action to indicate that this action works with multiple records. Normally used in batch triggers or batch create/update/upsert actions where users can pass a list of records.  
UI reference | ![](data:image/png;base64,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)  

* * *

## [#](<#bulk>) `bulk`

Attribute | Description  
---|---  
Key | `bulk`  
Type | Boolean  
Required | Optional.  
Description | This presents a "Bulk" tag next to your action to indicate that this action works with a large flat file of records. Normally used bulk create/update/upsert actions where users pass a CSV of records.  
UI reference | ![](/assets/img/bulk.1d2a80e6.png)  

* * *

## [#](<#deprecated>) `deprecated`

Attribute | Description  
---|---  
Key | `deprecated`  
Type | Boolean  
Required | Optional.  
Description | This presents a "deprecated" tag next to your action to indicate that this action has been deprecated. Recipes which used to use this action will continue to work but future recipes will not be able to search and select this action.  
UI reference | ![](/assets/img/deprecated.3e09de36.png)  

TIP

Deprecation is a great way to move users to new actions when changes are not backwards compatible. This gives you more freedom to make your actions more usable or cater for upcoming API changes.

* * *

## [#](<#config-fields>) `config_fields`

Attribute | Description  
---|---  
Key | `config_fields`  
Type | Array  
Required | Optional.  
Description | This key accepts an array of hashes which show up as input fields shown to a user. Config fields are shown to a user before input fields are rendered and can be used to alter what set of input fields are shown to an end user. This is often used in generic object actions where config fields prompt a user to select the object and input fields are rendered based on that selection. To know more about how to define config fields in Workato, click [here.](</developing-connectors/sdk/sdk-reference/schema.html>)  
Expected Output | Array of hashes. Each hash in this array corresponds to a separate config field.  
UI reference | ![](/assets/img/config_fields.02e2eb97.gif)  

TIP

Config fields are powerful tools to introduce dynamic behavior to your actions. Use them to make your connector easier to use and discover new features. In the example gif above, you can see that the input "Event" actually causes more input fields to render. These input fields are rendered based on the selection of the value "Meeting".

* * *

## [#](<#input-fields>) `input_fields`

Attribute | Description  
---|---  
Key | `input_fields`  
Type | lambda function  
Required | True  
Description | This lambda function allows you to define what input fields should be shown to a user configuring this action in the recipe editor. Output of this lambda function should be an array of hashes, where each hash in this array corresponds to a separate input field. To know more about how to define input fields in Workato, click [here.](</developing-connectors/sdk/sdk-reference/schema.html>)  
Possible Arguments | `object_definitions` \- Allows you to reference an object definitions. Object definitions are stores of these arrays hashes which may be used to represent both input fields or output fields (datapills). These can be referenced by any action or trigger.   
`connection` \- Hash representing user given inputs defined in `connection`.   
`config_fields` \- Hash representing user given inputs defined in `config_fields`, if applicable.  
Expected Output | Array of hashes. Each hash in this array corresponds to a separate input field.  
UI reference | ![](/assets/img/input_fields.a652188c.png)  

* * *

## [#](<#execute>) `execute`

Attribute | Description  
---|---  
Key | `execute`  
Type | lambda function  
Required | True  
Description | This lambda function allows you to define what this action does with the inputs that have been passed to it from an end user. These inputs may be static values or datapills from upstream actions or the trigger. These are then used to send a HTTP request to retrieve data that can be presented as datapills.   

Optionally, you can also use the execute lambda function to do any pre-processing of input data before sending it as a request and post-processing of response data before passing it out as datapills.  
Possible Arguments | `connection` \- Hash representing user given inputs defined in `Connection`   
`input` \- Hash representing user given inputs defined in `input_fields`   
`extended_input_schema` \- See below for examples.   
`extended_output_schema` \- See below for examples   
`continue` \- Hash representing cursor from the previous invocation of execute. OPTIONAL and used for asynchronous actions. See below for examples.  
Expected Output | Hash representing the data to be mapped to the output datapills of this action.  
Example - execute: - extended_input_schema and extended_output_schema

Extended input and output schema is any schema from `object_definitions` that is used in your action. This information is often useful when you dynamically generate schema and you want to use it to do data pre- or post-processing. These arguments do not include config_fields.

For example, you may use extended_input_schema to know which inputs are datetimes and should be transformed to Epoch time which is accepted by the target API. In the same fashion, you may use extended_output_schema to take the response and transform Epoch variables into ISO8601 datetimes again.
```ruby
 
        create_object: {
          description: lambda do |input, picklist_label|
            "Create a <span class='provider'>#{picklist_label['object'] || 'object'}</span> in " \
            "<span class='provider'>Percolate</span>"
          end,

          config_fields: [
            {
              name: 'object',
              control_type: 'select',
              pick_list: 'object_types',
              optional: false
            }
          ],

          input_fields: lambda do |object_definitions, connection, config_fields|
            object = config_fields['object']
            object_definitions[object].ignored('id')
          end,

         execute: lambda do |connection, input, extended_input_schema, extended_output_schema|
           puts extended_input_schema
           # [
           #   {
           #     "type": "string",
           #     "name": "status",
           #     "control_type": "select",
           #     "label": "Status",
           #     "hint": "Status is required for creating Content",
           #     "pick_list": "post_statuses",
           #     "optional": false
           #   },
           #   ...
           # ]

           puts extended_output_schema
           # [
           #   {
           #     "type": "string",
           #     "name": "id",
           #     "control_type": "text",
           #     "label": "Content ID",
           #     "hint": "The Content ID, Example: <b>post:45565410</b>.",
           #     "optional": true
           #   },
           #   {
           #     "type": "string",
           #     "name": "status",
           #     "control_type": "select",
           #     "label": "Status",
           #     "hint": "Status is required for creating Content",
           #     "pick_list": "post_statuses",
           #     "optional": false
           #   },
           #   ...
           # ]
         end,

         output_fields: lambda do |object_definitions, connection, config_fields|
           object = config_fields['object']
           object_definitions[object]
          end,
        }


```

Example - execute: - continue

When working with asynchronous APIs to kickstart a long running job or process in a target application, often times you'll send a request and expect an ID that corresponds to that job or process. Your action would then want to constantly check back with the API to see if the job is completed before retrieving results or moving on to the next step in the recipe.

For example, when you send a request to Google BigQuery to start a query, Google BigQuery might send you back the job ID. Your task would be to now regularly check back with Google BigQuery to see if the query is completed before retrieving the rows.

Rather than having the user configure this logic in the recipe, you can now embed this entire logic into a single action with "multi-step" actions on your custom connector. To use "multi-step" actions, the `continue` argument is used in conjunction with a dedicated method called `reinvoke_after`. Below, we go through some examples of what the `continue` argument might be.

To learn more about creating your "multistep" actions, read our guide [here](</developing-connectors/sdk/guides/building-actions/multistep-actions.html>).
```ruby
 
        multistep_action_sample: {
          input_fields: lambda do |object_definitions, connection, config_fields|

          end,

         execute: lambda do |connection, input, e_i_s, e_o_s, continue|

          if !continue.present? #continue is nil on the first invocation of the execute
            puts continue
            # nil
            reinvoke_after(seconds: 100, continue: { current_step: 1 })
          elsif continue['current_step'] == 1 #first reinvocation
            puts continue
            # {
            #   "current_step": 1
            # }
            reinvoke_after(seconds: 100, continue: { current_step: continue['current_step'] + 1 })
          else
            puts continue
            # {
            #   "current_step": 2
            # }
          end

         end,

         output_fields: lambda do |object_definitions, connection, config_fields|

          end,
        }


```

* * *

## [#](<#before-suspend>) `before_suspend`

Attribute | Description  
---|---  
Key | `before_suspend`  
Type | lambda function  
Required | False  
Description | This lambda function is exclusive to [Wait for resume actions](</developing-connectors/sdk/guides/building-actions/wait-for-resume-actions.html>). It is invoked after the `suspend` method is called in the `execute` lambda. It allows you to define an authenticated API request based on the `apply` to an external system to register a callback to resume the job.  
Possible arguments | 

  * `resume_token`: This token is specific to a particular job and is generated by the Workato framework. When the external system intends to resume a job, it must include this token in its resume request to the Resume job API.
  * `expires_at`: Timestamp in PST representing the time the job expires and resumes with a timeout.
  * `continue`: The `continue` hash passed from the `suspend` method. This can contain important information including the ID of the process in the external system.

Expected output | N/A  

* * *

## [#](<#before-resume>) `before_resume`

Attribute | Description  
---|---  
Key | `before_resume`  
Type | lambda function  
Required | False  
Description | This lambda function is exclusive to [Wait for resume actions](</developing-connectors/sdk/guides/building-actions/wait-for-resume-actions.html>). It is invoked after the external system has dispatched the API request to resume the job. It enables you to control the state of the `continue` hash, which is transmitted back to the `execute` lambda when the job resumes. Additionally, it grants access to the data value in the API request.  
Possible arguments | 

  * `data`: This represents the `data` value in the API request to resume the job.
  * `input`: The input that the recipe sends directly to the action.
  * `continue`: The `continue` hash passed from the `suspend` method. This can contain important information, including the ID of the process in the external system.

Expected output | N/A   
However, the lambda allows you to edit the value of the `continue` hash.  
Example- Edit the value of the continue hash

This example demonstrates how to edit the value of the `continue` hash.

If the `continue` method passed from the `suspend` method is:
```ruby
 
    {
      "state": "suspended",
      "job_id": "abc_123"
    }


```

and the `before_resume` lambda is:
```ruby
 
    before_resume: lambda do |data, input, continue|
      if continue["state"] == "suspended"
        continue["state"] = "resumed"
        continue["payload"] = "important data"
      else
        { "result" => "Unexpected state" }
      end
    end,


```

Then the `continue` argument passed to the `execute` lambda looks like this:
```ruby
 
    {
      "state": "resumed",
      "job_id": "abc_123",
      "payload": "important data"
    }


```

* * *

## [#](<#before-timeout-resume>) `before_timeout_resume`

Attribute | Description  
---|---  
Key | `before_timeout_resume`  
Type | lambda function  
Required | False  
Description | This lambda function is exclusive to [Wait for resume actions](</developing-connectors/sdk/guides/building-actions/wait-for-resume-actions.html>). It is invoked when the `expires_at` time has passed and Workato has not received an API request to resume the job. It allows you to manage the state of the `continue` hash which is passed back to the `execute` lambda when the job resumes.  
Possible arguments | 

  * `input`: The input that the recipe sends directly to the action.
  * `continue`: The `continue` hash passed from the `suspend` method. This can contain important information, including the ID of the process in the external system.

Expected output | N/A  
However, the lambda allows you to edit the value of the `continue hash`. Refer to the `before_resume` example to learn more.  

* * *

## [#](<#output-fields>) `output_fields`

Attribute | Description  
---|---  
Key | `output_fields`  
Type | lambda function  
Required | True  
Description | This lambda function allows you to define what output fields (datapills) should be shown to a user configuring this action in the recipe editor. The output of this lambda function should be an array of hashes, where each hash in this array corresponds to a separate output field (datapill). To know more about how to define input fields in Workato, click [here.](</developing-connectors/sdk/sdk-reference/schema.html>)  
Possible Arguments | `object_definitions` \- Allows you to reference an object definitions. Object definitions are stores of these arrays which can represent either input and output fields. These can be referenced by any action or trigger.   
`connection` \- Hash representing user given inputs defined in `connection`.   
`config_fields` \- Hash representing user given inputs defined in `config_fields`, if applicable.  
Expected Output | Array of hashes. Each hash in this array corresponds to a separate input field.  
UI reference | ![](/assets/img/output_fields.ea775e7c.png)  
Example - output_fields:

Output fields relate directly to the datapills that users see in the recipe editor. The definition of these output fields are mapped to the output of the `execute` lambda function which is a hash.
```ruby
 
        create_object: {
         execute: lambda do |connection, input, extended_input_schema, extended_output_schema|
           post("/object/create", input)
           # JSON response passed out of the execute: lambda function.
           #  {
           #    "id": 142414,
           #    "title": "Newly created object",
           #    "description": "This was created via an API"
           #  }
         end,

         output_fields: lambda do |object_definitions, connection, config_fields|
           [
             {
               name: "id",
               type: "integer"
             },
             {
               name: "title",
               type: "string"
             },
             {
               name: "description",
               type: "string"
             }
           ]
          end,
        }


```

* * *

## [#](<#sample-output>) `sample_output`

Attribute | Description  
---|---  
Key | `sample_output`  
Type | lambda function  
Required | False.  
Description | This lambda function allows you to define a sample output that is displayed next to your output fields (datapills).  
Possible Arguments | `connection` \- Hash representing user given inputs defined in `connection`.   
`input` \- Hash representing user given inputs defined in `input_fields`  
Expected Output | Hash. This hash should be a stubbed output of the `execute` lambda function.  
UI reference | ![](/assets/img/sample_output.1785f345.png)  

* * *

## [#](<#retry-on-response>) `retry_on_response`

Attribute | Description  
---|---  
Key | `retry_on_response`  
Type | Array  
Required | False.  
Description | **Used in conjunction with retry_on_request: and max_retries:**   

Use this declaration to implement a retry mechanism for certain HTTP methods and responses. This guards against APIs which may sometime return errors due to server failure such as 500 Internal Server Error codes.   

When supplying this array, we will accept what error codes to retry on as well as entire string or regex expressions.   

In cases where no error code is defined, Workato will only search the message body for any given regex or plain string IF the error codes fall under a default list of codes: (429, 500, 502, 503, 504, 507). When supplying an entire string instead of regex, this will give only retry if the entire response matches exactly.   

If entire strings or regex match and error codes are defined, both the error codes and strings must match for retries to be triggered  
Expected Output | Array. For example, `[500]` or `[500,/error/]` or `[‘“error”’, 500]`  

* * *

## [#](<#retry-on-request>) `retry_on_request`

Attribute | Description  
---|---  
Key | `retry_on_request`  
Type | Array  
Required | False.  
Description | **Used in conjunction with retry_on_request: and max_retries:**   

Use this declaration to implement a retry mechanism for certain HTTP methods and responses. This guards against APIs which may sometime return errors due to server failure such as 500 Internal Server Error codes.   

Optional. When not defined, it defaults to only “GET” and “HEAD” HTTP requests.  
Expected Output | Array. For example, `[“GET”]` or `[“GET”, “HEAD”]`  

* * *

## [#](<#max-retries>) `max_retries`

Attribute | Description  
---|---  
Key | `max_retries`  
Type | Int  
Required | False.  
Description | **Used in conjunction with retry_on_request: and max_retries:**   

Use this declaration to implement a retry mechanism for certain HTTP methods and responses. This guards against APIs which may sometime return errors due to server failure such as 500 Internal Server Error codes.   

The number of retries. A maximum of 3 allowed. If more than 3, action retries 3 times.   

Workato waits 5 seconds for the first retry and increases the interval by 5 seconds for each subsequent retry.  
Expected Output | Int. For example, `1` or `2`  

TIP

  * We recommend using only one HTTP method per action if possible
  * Multiple GET requests within a single action are also possible
  * Since we retry on an action level, actions should be defined to only at most only one POST request. This guards against cases where the first post request succeeds and the second post request fails.

Example - Implementing the retry mechanism

Retrying an API request is very useful in ensuring that your actions (and recipes) are tolerant to any inconsistencies in the target App. To implement this, you will need to use a combination of the retry_on_response:, retry_on_request: and max_retries: keys.
```ruby
 
        actions: {
          custom_http: {
            input_fields: lambda do |object_definitions|
              [{ name: 'url', optional: false }]
            end,

            execute: lambda do |_connection, input|
              {
                results: get(input['url'])
              }
            end,

            output_fields: lambda do |object_definitions|
              []
            end,

            retry_on_response: [500, /error/] # contains error codes and error message match rules

            retry_on_request: ["GET", "HEAD"],

            max_retries: 3
          }
        }


```

* * *

## [#](<#summarize-input>) `summarize_input`

Attribute | Description  
---|---  
Key | `summarize_input`  
Type | Array  
Required | False.  
Description | Use this to summarize your input which contain long lists. Summarizing your input is important to keep the jobs page lightweight so it can load quickly. In general, when your input has lists that are longer than 100 lines, they should be summarized.  
Expected Output | Array. For example, `['leads']` or `['report.records', 'report.description']`  

* * *

## [#](<#summarize-output>) `summarize_output`

Attribute | Description  
---|---  
Key | `summarize_output`  
Type | Array  
Required | False.  
Description | Use this to summarize your actions output which contain long lists. Summarizing your output is important to keep the jobs page lightweight so it can load quickly. In general, when your output has lists that are longer than 100 lines, they should be summarized.  
Expected Output | Array. For example, `['leads']` or `['report.records', 'report.description']`  
UI reference | ![](/assets/img/job_input_summarized.631f2b8f.png)  
Example - Summarizing inputs and outputs in job data

When working with large arrays or data, Workato tries to show all the data in the input and output tabs of the job for each action. Sometimes, this can get confusing when we are working with a large numbers of records or large strings. You can use the `summarize_input` and `summarize_output` keys to summarize the data in your job input and output tabs to make it more human readable for users of your connector.
```ruby
 
        input_fields: lambda do
          [
            {
              name: 'report',
              type: 'object',
              properties: [
                {
                  name: 'records',
                  type: :array,
                  of: :object,
                  properties: [
                    {
                      name: 'item_name',
                      type: 'string'
                    }
                  ]
                },
                {
                  name: 'description',
                  type: 'string'
                },
                {
                  name: 'comment',
                  type: 'string'
                }
              ],
            }
          ]
        end,

        summarize_input: ['report.records', 'report.description'],


```

```

### references/sdk-reference__triggers.md

```markdown
# Workato SDK Documentation

> **Source**: https://docs.workato.com/en/developing-connectors/sdk/sdk-reference/triggers.html
> **Fetched**: 2026-01-18T02:50:38.783997

---

# [#](<#sdk-reference-triggers>) SDK Reference - `triggers`

This section enumerates all the possible keys to define a trigger. There are 3 types of triggers available for you to use in Workato:

  * Polling triggers (Check for new events every 5 minutes)
  * Dynamic webhook triggers (Triggers in real time from webhooks. Programmatic subscription and teardown of webhook URLs must be possible in the App)
  * Static webhook triggers (Triggers in real time from webhooks. Webhook URLs are passed from Workato to App by the end user.)

Quick Overview

The `triggers` key can only be used in both recipes and the SDK **Test code** tab after you have created a successful connection. Triggers are configured by end users of your connector and kick start recipes.

## [#](<#structure>) Structure
```ruby
 
        triggers: {

          [Unique_trigger_name]: {
            title: String,

            subtitle: String,

            description: lambda do |input, picklist_label|
              String
            end,

            help: lambda do |input, picklist_label|
              Hash
            end,

            display_priority: Integer,

            batch: Boolean,

            bulk: Boolean,

            deprecated: Boolean,

            config_fields: Array

            input_fields: lambda do |object_definitions, connection, config_fields|
              Array
            end,

            webhook_key: lambda do |connection, input|
              String
            end,

            webhook_response_type: String,

            webhook_response_body: String,

            webhook_response_headers: String,

            webhook_response_status: Integer,

            webhook_payload_type: String,

            webhook_subscribe: lambda do |webhook_url, connection, input, recipe_id|
              Hash or Array
            end,

            webhook_refresh: lambda do |webhook_subscribe_output|
              Array
            end,

            webhook_unsubscribe: lambda do |webhook_subscribe_output, connection|
              Hash
            end,

            webhook_notification: lambda do |input, payload, extended_input_schema, extended_output_schema, headers, params, connection, webhook_subscribe_output|
              Hash or Array
            end,

            poll: lambda do |connection, input, closure|
              Hash
            end,

            dedup: lambda do |record|
              String
            end,

            output_fields: lambda do |object_definitions, connection, config_fields|
              Array
            end,

            sample_output: lambda do |connection, input|
              Hash
            end,

            summarize_input: Array,

            summarize_output: Array
          },

          [Another_unique_trigger_name]: {
            ...
          }
        },


```

* * *

## [#](<#title>) `title`

Attribute | Description  
---|---  
Key | `title`  
Type | String  
Required | Optional. Defaults to title built from labeled key.  
Description | This allows you to define the title of your trigger, which might differ from the name of the key assigned to it - Key = `new_updated_object`, title = `"New/updated object"`  
Expected Output | `String`   
i.e. `"New/updated object"`  
UI reference | ![](/assets/img/title.48365f4d.png)  

TIP

In Workato, we generally advise the following structure for triggers "[Adjective] [Object]" - "New lead" or "New/updated contact" rather than "Lead created".

* * *

## [#](<#subtitle>) `subtitle`

Attribute | Description  
---|---  
Key | `subtitle`  
Type | String  
Required | Optional. Defaults to subtitle inferred from connector name and trigger title.  
Description | This allows you to define the subtitle of your trigger.  
Expected Output | `String`   
i.e. `"Use complex queries to search objects in Percolate"`  
UI reference | ![](/assets/img/subtitle.9fbdfa1b.png)  

TIP

To make your subtitles meaningful, try to provide more information in here whilst keeping your titles concise. For example, your title could be "New/updated object" whereas your subtitle could be "Trigger off new/updated leads, contacts etc." When users search for a specific triggers, Workato also searches for matches in the subtitle.

* * *

## [#](<#description>) `description`

Attribute | Description  
---|---  
Key | `description`  
Type | lambda function  
Required | Optional. Defaults to description inferred from connector name and trigger title.  
Description | This allows you to define the description of your trigger when viewed in the recipe editor. This can be a static description or a dynamic one based on your needs.  
Possible Arguments | `input` \- Hash representing user given inputs defined in `input_fields`   
`picklist_label` \- Only applicable for picklists where a user's answer consist of both a picklist label and value. This Hash represents the label for a user's given inputs for picklist fields. See below for use cases.  
Expected Output | `String`   
i.e. `"New or updated <span class='provider'>campaign</span> in <span class='provider'>Percolate</span>"` Add the `<span>` HTML tags to add weight to your description text.  
UI reference | ![](data:image/png;base64,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)  
Example - description:

For the `description` block, you have access to two arguments to make your descriptions dynamic. This is useful when you want to change your description based on how a given user has configured the action. These changes can be incredibly useful for your users to ensure they know what this action is doing without having to click and view the action's configuration to understand what it does.
```ruby
 
        new_updated_object: {
          description: lambda do |input, picklist_label|
            "New or updated <span class='provider'>#{picklist_label['object'] || 'object'}</span> in " \
            "<span class='provider'>Percolate</span>"
          end,

          config_fields: [
            {
              name: 'object',
              control_type: 'select',
              pick_list: 'object_types',
              optional: false
            }
          ]

          # More keys to define the action
        }


```

In the preceding example, the action is a generic object action that allows the user to choose between multiple object types when configuring the recipe. You can change the description of the object the user selects by referencing the `picklist_label` argument.

![](/assets/img/trigger-description-example.2c423386.gif)

* * *

## [#](<#help>) `help`

Attribute | Description  
---|---  
Key | `help`  
Type | lambda function  
Required | Optional. No help is displayed otherwise.  
Description | The help text that is meant to guide your users as to how to configure this trigger. You can also point them to documentation.  
Possible Arguments | `input` \- Hash representing user given inputs defined in `input_fields`   
`picklist_label` \- Only applicable for picklists where a user's answer consist of both a picklist label and value. This Hash represents the label for a user's given inputs for picklist fields. See below for use cases.  
`connection` \- Hash representing user given inputs defined in `connection`.   
`webhook_base_url` \- Used when you are using [static webhook triggers](</developing-connectors/sdk/guides/building-triggers/static-webhook.html>). String representing the static webhook url of your connector.  
Expected Output | `Hash` or `String` See below for examples.  
UI reference | ![](data:image/png;base64,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)  
Example - help:

The output of the `help` lambda function can either be a simple String or a Hash. Below we go through the two examples:

  * String

```ruby
 
        help: lambda do |input, picklist_label, connection, webhook_base_url|
          'Create an object in Percolate. First, select from a list of ' \
          'objects that we currently support. After selecting your object,' \
          ' dynamic input fields specific to your scope and object selected ' \
          'will be populated.' \
          ' Creating an approval denotes submitting a specified piece of content' \
          ' or campaign for a specific approval workflow.'
        end,


```

  * Hash

```ruby
 
        help: lambda do |input, picklist_label, connection, webhook_base_url|
          {
            body: "First, filter by the object you want then fill up the input fields " \
            "which appear based on the object you have selected. Amongst other things, " \
            "you’ll be able to search for contacts in your company and cloud recordings from the past. ",
            learn_more_url: "https://docs.workato.com/connectors/zoom/event-actions.html#search-event-details",
            learn_more_text: "Learn more"
          }
        end,


```

![](/assets/img/help-example.bdfb4b3c.png)

Example - Static webhook triggers - Using connection and inputs to create a Unique webhook URL

When you may have a single connector and static webhook url that needs to power multiple recipes across multiple connections, you might need your users to register webhook URLs that contain attributes specific to their connections. You can now do this through the `help` lambda where you can provide a webhook URL for your users to register that include any connection attributes within the webhook's URL parameters.
```ruby
 
        {
          title: "Sample connector",

          webhook_keys: lambda do |params, headers, payload|
            "#{params['org_id']}@#{payload['formId']}"
          end,

          triggers: {
            sample_static_webhook_trigger: {

              help: lambda do |input, picklist_label, connection, webhook_base_url|
                next unless webhook_base_url.present?
                <<~HTML
                Creates a job when an form submission is received. To set this webhook up,
                'you will need to register the webhook below under "settings" => "webhooks" => "new". <br>
                <b>Webhook endpoint URL</b>
                <b class="tips__highlight">#{webhook_base_url}?org_id=#{connection['org_id']}</b>
                HTML
              end,

              webhook_key: lambda do |connection, input|
                "#{connection['org_id']}@#{input['formId']}"
              end,

              input_fields: lambda do |object_definitions, connection, config_fields|
                [
                  {
                    name: 'formId',
                    label: "Form",
                    control_type: "select",
                    pick_list: "forms",
                    hint: "Select the form you want to trigger this recipe off."
                  }
                ]
              end,
            }
          }
        }


```

* * *

## [#](<#display-priority>) `display_priority`

Attribute | Description  
---|---  
Key | `display_priority`  
Type | Integer  
Required | Optional. Defaults to zero, otherwise to the alphabetical ordering of actions titles.  
Description | This allows you to influence the ordering of the trigger in the recipe editor so that you can highlight top triggers. The higher the integer, the higher the priority. If two triggers have the same priority, they are ordered by their titles.  

* * *

## [#](<#batch>) `batch`

Attribute | Description  
---|---  
Key | `batch`  
Type | Boolean  
Required | Optional.  
Description | This presents a "Batch" tag next to your action to indicate that this action works with multiple records. Normally used in batch triggers or batch create/update/upsert actions where users can pass a list of records.  
UI reference | ![](data:image/png;base64,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)  

* * *

## [#](<#bulk>) `bulk`

Attribute | Description  
---|---  
Key | `bulk`  
Type | Boolean  
Required | Optional.  
Description | This presents a "Bulk" tag next to your action to indicate that this action works with a large flat file of records. Normally used bulk create/update/upsert actions where users pass a CSV of records.  
UI reference | ![](/assets/img/bulk.1d2a80e6.png)  

* * *

## [#](<#deprecated>) `deprecated`

Attribute | Description  
---|---  
Key | `deprecated`  
Type | Boolean  
Required | Optional.  
Description | This presents a "deprecated" tag next to your action to indicate that this action has been deprecated. Recipes which used to use this action will continue to work but future recipes will not be able to search and select this action.  
UI reference | ![](/assets/img/deprecated.3e09de36.png)  

TIP

Deprecation is a great way to move users to new actions when changes are not backwards compatible. This gives you more freedom to make your actions more usable or cater for upcoming API changes.

* * *

## [#](<#config-fields>) `config_fields`

Attribute | Description  
---|---  
Key | `config_fields`  
Type | Array  
Required | Optional.  
Description | This key accepts an array of hashes which show up as input fields shown to a user. Config fields are shown to a user before input fields are rendered and can be used to alter what set of input fields are shown to an end user. This is often used in generic object actions where config fields prompt a user to select the object and input fields are rendered based on that selection. Inputs given to `config_fields` can be referenced by the connector in the `input_fields` lambda function via an argument. It is also present as an argument in all `object_defintions`. To know more about how to define config fields in Workato, click [here.](</developing-connectors/sdk/sdk-reference/schema.html>)  
Expected Output | Array of hashes. Each hash in this array corresponds to a separate config field.  
UI reference | ![](/assets/img/config_fields.02e2eb97.gif)  

TIP

Config fields are powerful tools to introduce dynamic behavior to your actions. Use them to make your connector easier to use and discover new features. In the example gif above, you can see that the input "Event" actually causes more input fields to render. These input fields are rendered based on the selection of the value "Meeting".

* * *

## [#](<#input-fields>) `input_fields`

Attribute | Description  
---|---  
Key | `input_fields`  
Type | lambda function  
Required | True  
Description | This lambda function allows you to define what input fields should be shown to a user configuring this trigger in the recipe editor. Output of this lambda function should be an array of hashes, where each hash in this array corresponds to a separate input field. To know more about how to define input fields in Workato, click [here.](</developing-connectors/sdk/sdk-reference/schema.html>)  
Possible Arguments | `object_definitions` \- Allows you to reference an object definitions. Object definitions are stores of these arrays hashes which may be used to represent both input fields or output fields (datapills). These can be referenced by any action or trigger.   
`connection` \- Hash representing user given inputs defined in `connection`.   
`config_fields` \- Hash representing user given inputs defined in `config_fields`, if applicable.  
Expected Output | Array of hashes. Each hash in this array corresponds to a separate input field.  
UI reference | ![](/assets/img/input_fields.a652188c.png)  

* * *

## [#](<#webhook-key>) `webhook_key`

Attribute | Description  
---|---  
Key | `webhook_key`  
Type | lambda function  
Required | True if trigger is a static webhook trigger. False otherwise. Should not be used when `webhook_subscribe`, `webhook_unsubscribe` is defined.  
Description | **Used in conjunction with`webhook_keys` which should be present as a root level key in the connector - same level as `actions` and `triggers`**   

Allows you to use any user input from the connection or trigger to build a unique signature for this trigger. This can also be a static string value. When the signature in this lambda function match the signature in the `webhook_keys` lambda function, webhooks are sent to this trigger. See our [Static webhook guide for more details.](</developing-connectors/sdk/guides/building-triggers/static-webhook.html>)  
Possible Arguments | `connection` \- Hash representing user given inputs defined in `connection`.   
`input` \- Hash representing user given inputs defined in `input_fields`  
Expected Output | Array of hashes. Each hash in this array corresponds to a separate input field.  
Example - webhook_key:

The `webhook_key` lambda function is specific to a single trigger and the output signature if built from user inputs. On the other hand, the `webhook_keys` lambda function is tied to the entire connector and the output signature is built from the incoming webhook's attributes like its body, headers, and query parameters. When expecting a match in these two signature, it becomes easy to see how routing is done from incoming webhooks to the proper trigger to create jobs.
```ruby
 
        {
          title: "Sample connector",

          webhook_keys: lambda do |params, headers, payload|
            payload['formId']
          end,

          triggers: {
            sample_static_webhook_trigger: {

              help: lambda do |_input, _picklist_label|
                {
                  body: “Triggers in real-time whenever an event is created. Set up this trigger by registering the Webhook URL ” \
                        “below in <b>Settings</b> => <b>Webhooks</b>.“,
                  learn_more_url: “https://docs.workato.com”,
                  learn_more_text: “Learn more”
                }
              end,

              webhook_url_help: lambda do |_connection, _input, webhook_base_url|
                webhook_base_url
              end,

              input_fields: lambda do |object_definitions, connection, config_fields|
                [
                  {
                    name: 'formId',
                    label: "Form",
                    control_type: "select",
                    pick_list: "forms",
                    hint: "Select the form you want to trigger this recipe off."
                  }
                ]
              end,

              webhook_key: lambda do |connection, input|
                input['formId']
              end,
            }
          }
        }


```

* * *

## [#](<#webhook-response-type>) `webhook_response_type`

Attribute | Description  
---|---  
Key | `webhook_response_type`  
Type | String  
Required | Optional. Only applies to Dynamic webhook triggers ( triggers with `webhook_subscribe` and `webhook_unsubscribe`)  
Description | By default, Workato responds with no content-type headers to webhook events. `webhook_response_type` allows for 'plain' and 'json' which corresponds to content-type headers `text/plain` and `application/json` respectively.  

* * *

## [#](<#webhook-response-body>) `webhook_response_body`

Attribute | Description  
---|---  
Key | `webhook_response_body`  
Type | String  
Required | Optional. Only applies to Dynamic webhook triggers ( triggers with `webhook_subscribe` and `webhook_unsubscribe`)  
Description | By default, Workato responds with an empty body to webhook events. `webhook_response_body` allows for a mustache template that allows you to define how Workato should respond to webhooks.  

Mustache templates have access to the following variables:

name | description | example usage  
---|---|---  
headers | Contains request headers. Headers are normalized (x–custom-header -> X-Custom-Header) | ` { “challenge”:“{{{headers.X-Challenge}}}” } `  
body | Request body is parsed according to the `webhook_response_type`. You can use dot notation to access nested values. | ` { “challenge”: “{{body.x-challenge}}” } `  
query | Contains query params | ` { “X-Challenge”: “{{query.challenge}}” } `  
Example - webhook_response_body: - Defining a custom webhook response

Use `webhook_response_body` in two scenarios:

  1. You need to respond with a static string or JSON response to the webhook sender.

```ruby
 
      webhook_response_type: 'json',
      webhook_response_body: '{ "success": true }',


```

will result in Workato responding with a content-type `application/json` and the body
```ruby
 
    {
      "success": true
    }


```

  2. You need to respond with a dynamic response based on the webhook event. For example, when webhook senders send a webhook event to confirm that the webhook URL is ready.

```ruby
 
      webhook_response_type: 'json',
      webhook_response_body: '{ “challenge”: “{{body.verification.Challenge}}” }',


```

If the sender sends a webhook with the body
```ruby
 
    {
      "verification": {
        "Challenge": "abc123"
      }
    }


```

Then Workato would respond with
```ruby
 
    {
      "challenge": "abc123"
    }


```

In some cases, webhook senders may also send an array of events. You may also use regular iterators in Mustache to work with arrays.

For example, if the sender (based on Microsoft Event Grid)sends a webhook validation event with the body
```ruby
 
    [
      {
        "id": "2d1781af-3a4c-4d7c-bd0c-e34b19da4e66",
        "topic": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "subject": "",
        "data": {
          "validationCode": "512d38b6-c7b8-40c8-89fe-f46f9e9622b6",
          "validationUrl": "https://rp-eastus2.eventgrid.azure.net:553/eventsubscriptions/myeventsub/validate?id=0000000000-0000-0000-0000-00000000000000&t=2022-10-28T04:23:35.1981776Z&apiVersion=2018-05-01-preview&token=1A1A1A1A"
        },
        "eventType": "Microsoft.EventGrid.SubscriptionValidationEvent",
        "eventTime": "2022-10-28T04:23:35.1981776Z",
        "metadataVersion": "1",
        "dataVersion": "1"
      }
    ]


```

and expects us to respond with the `data.validationCode`. You may define your `webhook_response_body` as such.
```ruby
 
      webhook_response_type: 'json',
      webhook_response_body: '{{#body}}{ "validationResponse": “{{data.validationCode}}” }{{/body}}',


```

There may be a variety of situations where webhook senders may expect custom responses:

  1. Static or dynamic responses for each webhook event
  2. Responding to a challenge to confirm the webhook URL is ready to accept events

In our investigation, we have rarely found both to be the case. As such, this singular key `webhook_response_body` aims to accomplish both use cases. You may also use inbuilt logic such as [inverted sections (opens new window)](<https://mustache.github.io/mustache.5.html#Inverted-Sections>) in mustache templates for greater control over the webhook responses.

* * *

## [#](<#webhook-response-headers>) `webhook_response_headers`

Attribute | Description  
---|---  
Key | `webhook_response_headers`  
Type | String  
Required | Optional. Only applies to Dynamic webhook triggers ( triggers with `webhook_subscribe` and `webhook_unsubscribe`)  
Description | By default, Workato responds with an standard headers (rate limit, byte limit) to webhook events. `webhook_response_headers` allows for a mustache template that allows you to define what headers Workato should include in response headers. See [webhook_response_body](<#webhook-response-body>)  

WARNING

Workato only supports customization of headers starting with `x-` with the exception of `x-forwarded-host`, `x-forwarded-proto`, `x-forwarded-port`, `x-forwarded-for`, `x-request-id`, `x-frame-options` and `x-powered-by`.

* * *

## [#](<#webhook-response-status>) `webhook_response_status`

Attribute | Description  
---|---  
Key | `webhook_response_status`  
Type | Integer  
Required | Optional. Only applies to Dynamic webhook triggers ( triggers with `webhook_subscribe` and `webhook_unsubscribe`)  
Description | By default, Workato responds with 200 to webhook events. `webhook_response_status` allow you to customize this to any 2XX response codes.  

WARNING

Workato only supports customization 2XX response codes.

* * *

## [#](<#webhook-payload-type>) `webhook_payload_type`

Attribute | Description  
---|---  
Key | `webhook_payload_type`  
Type | String  
Required | Optional. Defaults to "parsed"  
Description | By default, Workato parses incoming webhook payloads using [JSON.parse() (opens new window)](<https://ruby-doc.org/stdlib-2.6.3/libdoc/json/rdoc/JSON.html#method-i-parse>). Setting `webhook_payload_type` to "raw" allows you to receive the raw webhook payload instead of a JSON parsed one.  
Example - webhook_payload_type: - Verifying webhooks or handling XML webhooks

Use `webhook_payload_type` in two scenarios:

  1. You need to compute a webhook payload signature based on the **raw** payload. You may do so in the webhook notification lambda before using `workato.parse_json` to get the parsed json payload.

```ruby
 
          webhook_payload_type: "raw",

          webhook_notification: lambda do |input, payload, extended_input_schema, extended_output_schema, headers, params, connection, webhook_subscribe_output|
            original_payload = payload
            client_secret = input['client_secret'] || account_property('hubspot_webhook_client_secret')
            if client_secret.present?
              source_string = client_secret + original_payload
              v1_signature = source_string.encode_sha256.encode_hex
            end

            if (client_secret.present? && v1_signature == headers['X-Hubspot-Signature']) || !client_secret.present?
              payload = workato.parse_json(payload).select do |event|
                event['propertyName'] == input['contact_property'] && event['subscriptionType'] == 'contact.propertyChange'
              end

              if payload.length > 0 
                { 
                  events: payload,
                  headers: headers,
                  webhook_validated: client_secret.present? ? true : false
                }
              end
            end
          end,


```

  2. You are receiving a webhook that is not in JSON format.

```ruby
 
          webhook_payload_type: "raw",

          webhook_notification: lambda do |input, payload, extended_input_schema, extended_output_schema, headers, params, connection, webhook_subscribe_output|
            payload.from_xml
          end,


```

* * *

## [#](<#webhook-subscribe>) `webhook_subscribe`

Attribute | Description  
---|---  
Key | `webhook_subscribe`  
Type | lambda function  
Required | True if trigger is a dynamic webhook trigger. False otherwise. Should not be used when `webhook_key` is defined.  
Description | This lambda function is used by dynamic webhook triggers to programmatically subscribe to webhooks. This function is invoked when a user starts the recipe using the trigger with this defined. See our [Dynamic webhook guide for more details.](</developing-connectors/sdk/guides/building-triggers/dynamic-webhook.html>)  
Possible Arguments | `webhook_url` \- String representing the **recipe-specific webhook URL**. This should be passed on to the API when creating the webhook subscription.   
`connection` \- Hash representing user given inputs defined in `connection`.   
`input` \- Hash representing user given inputs defined in `input_fields`   
`recipe_id` \- Int representing the ID of the recipe in Workato.  
Expected Output | There are two possible outputs:   
\- A hash which is passed on as `webhook_subscribe_output` to `webhook_unsubscribe`, `webhook_notification` and `webhook_refresh` lambda functions.   
\- An array where the first index is the same hash passed on as `webhook_subscribe_output` and the second index is the webhook expiration datetime which will trigger `webhook_refresh`.  
Dealing with webhook subscriptions that expire

Certain APIs like [Microsoft's Graph API (opens new window)](<https://docs.microsoft.com/en-us/graph/api/subscription-post-subscriptions?view=graph-rest-1.0&tabs=http>) allow you to create webhook subscriptions but they expire after a certain amount of time. This means your triggers need to be able to intelligently know when the webhook subscription is about to expire and refresh this subscription so you continue to receive events.

Sample code where webhook expires after 1 hour.
```ruby
 
          webhook_subscribe: lambda do |webhook_url, connection, input, recipe_id|    
            [
              post("https://www.acme.com/api/webhook_subscriptions", url: webhook_url),
              1.hour.from_now
            ]
          end,

          webhook_refresh: lambda do |webhook_subscribe_output|
            [
              patch("https://www.acme.com/api/webhook_subscriptions/#{webhook_subscribe_output['id']}", refresh: true),
              1.hour.from_now
            ]
          end,

          webhook_unsubscribe: lambda do |webhook_subscribe_output, connection|
            delete("https://www.acme.com/api/webhook_subscriptions/#{webhook_subscribe_output['id']}")
          end,


```

In the example above, the output of `webhook_subscribe` is an array that contains a datetime value that corresponds to the next time `webhook_refresh` is invoked to refresh the webhook subscription. This is similarly done for `webhook_refresh` as well. Take note that the output of `webhook_refresh` replaces the original `webhook_subscribe_output` as well.

* * *

## [#](<#webhook-refresh>) `webhook_refresh`

Attribute | Description  
---|---  
Key | `webhook_refresh`  
Type | lambda function  
Required | False. Only applicable when `webhook_subscribe` is defined.  
Description | This lambda function is invoked when your webhook subscription is set to have an expiry time, defined in the output of `webhook_subscribe`. It allows you to refresh as webhook subscriptions so your trigger can continue to receive events.  
Possible Arguments | `webhook_subscribe_output` \- Hash representing the output of the `webhook_subscribe` lambda function.  
Expected Output | \- An array where the first index is the same hash passed on as `webhook_subscribe_output` and the second index is the webhook expiration datetime which will trigger `webhook_refresh`.  

* * *

## [#](<#webhook-unsubscribe>) `webhook_unsubscribe`

Attribute | Description  
---|---  
Key | `webhook_unsubscribe`  
Type | lambda function  
Required | True if trigger is a dynamic webhook trigger. False otherwise. Should not be used when `webhook_key` is defined.  
Description | This lambda function is used by dynamic webhook triggers to programmatically teardown webhooks subscriptions. This function is invoked when a user stops the recipe using the trigger with this defined. See our [Dynamic webhook guide for more details.](</developing-connectors/sdk/guides/building-triggers/dynamic-webhook.html>)  
Possible Arguments | `webhook_subscribe_output` \- Hash representing the output of the `webhook_subscribe` lambda function.   
`connection` \- Hash representing user given inputs defined in `connection`.  
Expected Output | No output necessary.  

* * *

## [#](<#webhook-notification>) `webhook_notification`

Attribute | Description  
---|---  
Key | `webhook_notification`  
Type | lambda function  
Required | True if trigger is either a dynamic webhook trigger or a static webhook trigger.  
Description | This lambda function handles what this trigger should do with a webhook sent to it. You may use this function to do any data manipulation. This lambda function does not allow you to make additional HTTP requests or invoke additional reusable `methods`.  
Possible Arguments | `input` \- Hash representing user given inputs defined in `input_fields`   
`payload` \- Hash representing the incoming webhook's payload.   
`extended_input_schema` \- See below for examples.   
`extended_output_schema` \- See below for examples   
`headers` \- Hash representing the incoming webhook's headers.   
`params` \- Hash representing the incoming webhook's query parameters.   
`connection` \- Hash representing user given inputs defined in `connection`.   
`webhook_subscribe_output` \- Hash representing the output of the `webhook_subscribe` lambda function.  
Expected Output | Hash which represents the output of a single job or an array of hashes which represent individual jobs.  

Note

The webhook_notification lambda does not allow users to call `methods` or HTTP methods. If webhook payloads are skinny, please add actions that can take the output of the trigger to perform additional HTTP requests.

Webhook Validations

  * Workato performs validations on JSON based webhooks - denoted by the webhook's `Content-Type` header, to ensure that the payload is valid JSON. Otherwise, Workato responds with 400 bad request.
  * Incoming webhook payloads are expected to be UTF-8 compatible and Workato responds with 400 bad request if UTF-8 incompatible characters are found.

* * *

## [#](<#poll>) `poll`

Attribute | Description  
---|---  
Key | `poll`  
Type | lambda function  
Required | True if trigger is a [polling trigger](</developing-connectors/sdk/guides/building-triggers/poll.html>) or [Hybrid triggers](</developing-connectors/sdk/guides/building-triggers/hybrid-triggers.html>)  
Description | This lambda function handles the how this trigger retrieves new records from an API to create jobs. This function is invoked every poll interval (5 mins by default but configurable on a recipe level).  
Possible Arguments | `connection` \- Hash representing user given inputs defined in `connection`.   
`input` \- Hash representing user given inputs defined in `input_fields`   
`closure` \- Hash representing the cursor values passed to the `poll` lambda function from the previous execution of this same function.   
`extended_input_schema` \- See below for examples.   
`extended_output_schema` \- See below for examples  
Expected Output | Hash which contains 3 attributes   
\- Array of records to be turned into jobs   
\- Boolean flag which tells the trigger to poll again immediately instead of 5 mins later   
\- Value/Hash which is stored as the closure which will be passed to the next execution of this same function.   
See below for examples  

TIP

Closure values can be either a simple string/integer or a hash if you need to store multiple values for your cursor.

Example - poll:

The poll block's output should be a hash in the following structure:
```ruby
 
        poll: lambda do |connection, input, closure, _eis, _eos|

          # Timestamp which we need to filter records based off.
          updated_since = (closure || input['since']).to_time.utc.iso8601
          request_page_size = 100

          records = get("/records/endpoint").
                      params(
                         # filter for records only updated after this time
                        updated_since: updated_since,
                        page_size: request_page_size
                      )
          # Example JSON response
          # {
          #   data: [
          #     {
          #       "id": "abcd123",
          #       "name": "record1"
          #       ...
          #     },
          #     {
          #       "id": "dcba321",
          #       "name": "record2",
          #       ...
          #     },
          #     ...
          #   ],
          #   total_records: 1000
          # }

          # Derive last updated since timestamp to filter
          next_updated_since = records['data'].last['updated_at'] unless records.blank?

          {
            # Event accepts an array of records. Each record is a new job.
            events: records['data'],
            # Closure value which is passed as closure argument in next poll
            next_poll: next_updated_since,
            # Boolean flag to denote whether we should wait 5 mins to poll or poll immediately.
            # Poll immediately if total records is still more than page size.
            can_poll_more: records['total_records'] >= request_page_size
          }
        end,


```

Example - poll: - extended_input_schema and extended_output_schema

Extended input and output schema is any schema from `object_definitions` that is used in your action. This information is often useful when you dynamically generate schema and you want to use it to do data pre- or post-processing. These arguments do not include config_fields.

For example, you may use extended_input_schema to know which inputs are datetimes and should be transformed to Epoch time which is accepted by the target API. In the same fashion, you may use extended_output_schema to take the response and transform Epoch variables into ISO8601 datetimes again.
```ruby
 
        create_object: {
          description: lambda do |input, picklist_label|
            "Create a <span class='provider'>#{picklist_label['object'] || 'object'}</span> in " \
            "<span class='provider'>Percolate</span>"
          end,

          config_fields: [
            {
              name: 'object',
              control_type: 'select',
              pick_list: 'object_types',
              optional: false
            }
          ],

          input_fields: lambda do |object_definitions, connection, config_fields|
            object = config_fields['object']
            object_definitions[object].ignored('id')
          end,

         execute: lambda do |connection, input, extended_input_schema, extended_output_schema|
           puts extended_input_schema
           # [
           #   {
           #     "type": "string",
           #     "name": "status",
           #     "control_type": "select",
           #     "label": "Status",
           #     "hint": "Status is required for creating Content",
           #     "pick_list": "post_statuses",
           #     "optional": false
           #   },
           #   ...
           # ]

           puts extended_output_schema
           # [
           #   {
           #     "type": "string",
           #     "name": "id",
           #     "control_type": "text",
           #     "label": "Content ID",
           #     "hint": "The Content ID, Example: <b>post:45565410</b>.",
           #     "optional": true
           #   },
           #   {
           #     "type": "string",
           #     "name": "status",
           #     "control_type": "select",
           #     "label": "Status",
           #     "hint": "Status is required for creating Content",
           #     "pick_list": "post_statuses",
           #     "optional": false
           #   },
           #   ...
           # ]
         end,

         output_fields: lambda do |object_definitions, connection, config_fields|
           object = config_fields['object']
           object_definitions[object]
          end,
        }


```

* * *

## [#](<#dedup>) `dedup`

Attribute | Description  
---|---  
Key | `dedup`  
Type | lambda function  
Required | True.  
Description | This lambda function allows you to deduplicate trigger events so you don't trigger off the same events twice. This is done by forming a unique signature string based off attributes of the incoming record.  
Possible Arguments | `record` \- Hash representing a single record. This is a single index in the `events` array of a `poll` lambda function or the Hash output of the `webhook_notification` lambda function. .  
Expected Output | String - "#{record['id']}@#{record['created_at']}" or "#{record['id']}@#{record['updated_at']}"  

* * *

## [#](<#output-fields>) `output_fields`

Attribute | Description  
---|---  
Key | `output_fields`  
Type | lambda function  
Required | True  
Description | This lambda function allows you to define what output fields (datapills) should be shown to a user configuring this trigger in the recipe editor. The output of this lambda function should be an array of hashes, where each hash in this array corresponds to a separate output field (datapill). To know more about how to define input fields in Workato, click [here.](</developing-connectors/sdk/sdk-reference/schema.html>)  
Possible Arguments | `object_definitions` \- Allows you to reference an object definitions. Object definitions are stores of these arrays which can represent either input and output fields. These can be referenced by any action or trigger.   
`connection` \- Hash representing user given inputs defined in `connection`.   
`config_fields` \- Hash representing user given inputs defined in `config_fields`, if applicable.  
Expected Output | Array of hashes. Each hash in this array corresponds to a separate input field.  
UI reference | ![](/assets/img/output_fields.ea775e7c.png)  

* * *

## [#](<#sample-output>) `sample_output`

Attribute | Description  
---|---  
Key | `sample_output`  
Type | lambda function  
Required | False.  
Description | This lambda function allows you to define a sample output that is displayed next to your output fields (datapills).  
Possible Arguments | `connection` \- Hash representing user given inputs defined in `connection`.   
`input` \- Hash representing user given inputs defined in `input_fields`  
Expected Output | Hash. This hash should be a stubbed output of the `execute` lambda function.  
UI reference | ![](/assets/img/sample_output.1785f345.png)  

* * *

## [#](<#summarize-input>) `summarize_input`

Attribute | Description  
---|---  
Key | `summarize_input`  
Type | Array  
Required | False.  
Description | Use this to summarize your input which contain long lists. Summarizing your input is important to keep the jobs page lightweight so it can load quickly. In general, when your input has lists that are longer than 100 lines, they should be summarized.  
Expected Output | Array. For example, `['leads']` or `['report.records', 'report.description']`  

* * *

## [#](<#summarize-output>) `summarize_output`

Attribute | Description  
---|---  
Key | `summarize_output`  
Type | Array  
Required | False.  
Description | Use this to summarize your actions output which contain long lists. Summarizing your output is important to keep the jobs page lightweight so it can load quickly. In general, when your output has lists that are longer than 100 lines, they should be summarized.  
Expected Output | Array. For example, `['leads']` or `['report.records', 'report.description']`  
UI reference | ![](/assets/img/job_input_summarized.631f2b8f.png)  
Example - Summarizing inputs and outputs in job data

When working with large arrays or data, Workato tries to show all the data in the input and output tabs of the job for each action. Sometimes, this can get confusing when we are working with a large numbers of records or large strings. You can use the `summarize_input` and `summarize_output` keys to summarize the data in your job input and output tabs to make it more human readable for users of your connector.
```ruby
 
        input_fields: lambda do
          [
            {
              name: 'report',
              type: 'object',
              properties: [
                {
                  name: 'records',
                  type: :array,
                  of: :object,
                  properties: [
                    {
                      name: 'item_name',
                      type: 'string'
                    }
                  ]
                },
                {
                  name: 'description',
                  type: 'string'
                },
                {
                  name: 'comment',
                  type: 'string'
                }
              ],
            }
          ]
        end,

        summarize_input: ['report.records', 'report.description'],


```

```

### references/sdk-reference__connection.md

```markdown
# Workato SDK Documentation

> **Source**: https://docs.workato.com/en/developing-connectors/sdk/sdk-reference/connection.html
> **Fetched**: 2026-01-18T02:50:25.602062

---

# [#](<#sdk-reference-connection>) SDK Reference - `connection`

This section enumerates all the possible keys available when defining your connection.

Quick Overview

To put it simply, the `connection` hash contains all the instructions your connector needs to establish a successful connection.

  * The `fields` key tells your connector what input fields to show so it can collect information for authorization.
  * The `extended_fields` key allows you to dynamically show more connection fields based on previous inputs. This field is optional to define.
  * The `authorization` key tells your connector what to do with the information it has collected - use that to exchange it for an access_token.
  * The `base_uri`key tells your connector what to prepend to every HTTP request after connection is successful. This allows you to use relative paths in your connector code when defining actions and triggers.

## [#](<#structure>) Structure
```ruby
 
      connection: {
        fields: Array,

        extended_fields: lambda do |connection|
          Array
        end,

        authorization: Hash,

        base_uri: lambda do |connection|
          String
        end
      }


```

* * *

## [#](<#fields>) fields

The 'fields' key has the following attributes:

Key
    `fields`
Type
    Array
Required
    False
Description
    Accepts an array of hashes. Each hash in this array corresponds to a separate input field.  
To learn how to define input fields in Workato, see [SDK Reference - Schema](</developing-connectors/sdk/sdk-reference/schema.html>).

### [#](<#picklists-in-connection-fields>) Picklists in connection fields

For fields with `control_type` defined as `select` or `multiselect`, use the `options` attribute to define a static picklist instead of the `pick_list` attribute.

Picklist does not apply to connection hash

References to any picklists you defined in your connector are not accessible in the `connection` hash because no credentials have been received at this time.

### [#](<#example-connection-fields-with-picklist-nested-in-advanced-settings>) Example: Connection fields with picklist nested in advanced settings

![](/assets/img/connection-picklist.5a158c7b.png)
```ruby
 
        fields: [
          {
            name: 'api_key',
            control_type: 'password',
            hint: 'You can find your API key final change3' \
              "under 'Settings'=>'Configure Chargebee'=>'API Keys and Webhooks'" \
              " in Chargebee's web console.",
            label: 'Your API Key',
            default: "helloaaaabbb",
            optional: false
          },
          {
            name: 'domain',
            control_type: 'subdomain',
            url: 'chargebee.com'
          },
          {
            name: "advanced_settings",
            type: "object",
            optional: "true",
            properties: [
              {
                name: "environment",
                optional: true,
                control_type: "select",
                options: [
                  ["Development", "dev"],
                  ["Production", "prod"]
                ]
              }
            ]
          }
        ],


```

* * *

## [#](<#extended-fields>) extended_fields

The 'extended_fields' key has the following attributes:

Key
    `extended_fields`
Type
    lambda function
Required
    False
Description
    Allows you to optionally display more input fields based on your connection. The output is expected to be a valid Workato schema. Find out more about [SDK Reference - Schema](</developing-connectors/sdk/sdk-reference/schema.html>).

### [#](<#how-to-use-extended-fields>) How to use extended_fields

With `extended_fields`, you can dynamically display additional fields based on previous input fields. If your connection setup is complex and consists of many input fields, consider limiting the number of fields that a user can see. Instead of displaying all fields at the same time, use `extended_fields` to control how many fields to display to the user initially, and when to display additional fields.

In this case, `extended_fields` provides you with the added benefit of controlling which fields to display for the users during connection setup, and guiding them through the experience. In some cases, you may also restrict some fields from the display when they are not relevant.

### [#](<#example-connection-fields-with-extended-fields>) Example: Connection fields with extended_fields
```ruby
 
        fields: [
          {
            name: "api_key",
            control_type: "password",
            hint: "You can find your API key " \
              "under 'Settings'=>'Configure Chargebee'=>'API Keys and Webhooks'" \
              " in Chargebee's web console.",
            label: "Your API Key"
          },
          {
            name: "custom_domain",
            label: "Are you using a custom domain?",
            extends_schema: true,
            control_type: "checkbox"
          }
        ],

        extended_fields: lambda do |connection|
          if connection['custom_domain'] == "true"
            [
              {
                name: "domain",
                control_type: "subdomain",
                extends_schema: true,
                url: ".acme.com"
              }
            ]
          end
        end,


```

Workato passes the connection hash to all other lambdas, including `authorization` and `execute`. The connection hash contains values from both `fields` and `extended_fields`.

### [#](<#example-connection-fields-with-extended-fields-and-extends-schema>) Example: Connection fields with extended_fields and extends_schema

The following example shows how to use `extends_schema` within `extended_fields` to create a connection setup that has multiple steps.
```ruby
 
      connection: {
        fields: [
          {
            name: "api_key",
            control_type: "password",
            hint: "You can find your API key " \
              "under 'Settings'=>'Configure Chargebee'=>'API Keys and Webhooks'" \
              " in Chargebee's web console.",
            label: "Your API Key"
          },
          {
            name: "custom_domain",
            label: "Are you using a custom domain?",
            extends_schema: true,
            control_type: "checkbox"
          }
        ],

        extended_fields: lambda do |connection|
            [
              (
                if connection['custom_domain'] == "true"
                  {
                    name: "domain",
                    control_type: "subdomain",
                    optional: false,
                    url: ".acme.com"
                  }
                end 
              ),
              (
                if connection['custom_domain'] == "true"
                  {
                    name: "instance_type",
                    control_type: "select",
                    extends_schema: true,
                    optional: false,
                    options: [ ["Production", "production"], ["Sandbox", "sandbox"]]
                  }
                end 
              ),
              (
                if connection['instance_type'] == "sandbox"
                  {
                    name: "protocol",
                    control_type: "select",
                    optional: false,
                    options: [ ["HTTPS", "https://"], ["HTTP", "http://"]]
                  }
                end
              )
            ].compact
        end,

        authorization: {
          type: 'basic',

          apply: lambda { |connection, access_token|
            headers("x-api-key": "#{connection['api_key']}")
          }
        },

        base_uri: lambda do |connection|
            if connection['custom_domain'] == "true"
              "#{connection['protocol']}#{connection['domain']}.acme.com/"
            else
              "https://api.acme.com/"
            end
        end
      },


```

* * *

## [#](<#authorization>) authorization

The 'authorization' key has the following attributes:

Key
    `authorization`
Type
    Hash
Required
    True
Description
    Accepts an object with child keys corresponding to different types of authentication

Find out more about the `authorization` hash in [SDK Reference - authorization](</developing-connectors/sdk/sdk-reference/connection/authorization.html>).

* * *

## [#](<#base-uri>) base_uri

The 'base_uri' key has the following attributes:

Key
    `base_uri`
Type
    lambda function
Required
    False. However, we recommend it.
Description
    Defines the base URI for all future HTTP requests.
Possible Arguments

connection
    Hash that represents user-provided inputs defined in `Connection`.
Expected Output
    `String`, such as one of:  

  * `"https://#{connection['host']}.com/"`
  * `"https://api.acme.com"`

### [#](<#configuring-your-base-uri>) Configuring your base_uri

When you define your `base_uri` key, make sure to note the final URI that you provide. There are two scenarios when using `base_uri` in conjunction with any downstream HTTP requests.

  1. When you have a preceding "/" (forward slash) in the verb method (such as `get('/hello/there')`), we ignore any path parameters in the `base_uri`.

For example, `https://api.hubapi.com/test/` defined as your `base_uri` effectively becomes `https://api.hubapi.com`. The request is sent to `https://api.hubapi.com/hello/there`.

  2. If you **don’t** have a preceding "/" (forward slash) in the verb method (such as `get('hello/there')`), we adopt the path parameters in your `base_uri`.

For example, `https://api.hubapi.com/test/` defined as your `base_uri` remains `https://api.hubapi.com/test/`. The request is sent to `https://api.hubapi.com/test/hello/there`.

```

### references/sdk-reference__connection__authorization.md

```markdown
# Workato SDK Documentation

> **Source**: https://docs.workato.com/en/developing-connectors/sdk/sdk-reference/connection/authorization.html
> **Fetched**: 2026-01-18T02:50:26.841100

---

# [#](<#sdk-reference-authorization>) SDK Reference - `authorization`

This section enumerates all possible keys in the `authorization` hash. Some keys apply only to specific types of authentication. Immediately after the user clicks "Connect", Workato runs the code in the `authorization` hash.

The `authorization` hash contains all instructions for your connector to retrieve and use authorization parameters. This may be simple: where to place an API key in future requests. It could also be much more complex: running a series of HTTP requests to retrieve an access token.

## [#](<#structure>) Structure
```ruby
 
      authorization: {
        type: String,

        client_id: lambda do |connection|
          String
        end,

        client_secret: lambda do |connection|
          String
        end,

        authorization_url: lambda do |connection|
          String
        end,

        token_url: lambda do |connection|
          String
        end,

        acquire: lambda do |connection, auth_code, redirect_uri, verifier|
          Hash or Array
        end,

        apply: lambda do |connection, access_token|
          # see apply documentation for more information
        end,

        refresh_on: Array,

        detect_on: Array,

        refresh: lambda do |connection, refresh_token|
          Hash or Array
        end,

        identity: lambda do |connection|
          String
        end,
        pkce: lambda do |verifier, challenge|
          Hash
        end,

        selected: lambda do |connection|
          String
        end,

        options: Hash,

        noopener: Boolean
      }


```

* * *

## [#](<#type>) `type`

Attribute | Description  
---|---  
Key | `type`  
Type | String  
Required | True  
Description | Denotes the type of authentication used for this connector.  
Expected Output | **One of the following:**   
"basic_auth" - Used for Basic authentication.   
"api_key" - Used for API key authentication.   
"oauth2" - Used only for OAuth 2.0 **Auth Code Grant flows**. For other OAuth variations, use "custom_auth".   
"custom_auth" - Free form authentication. Use this for multi-step, JWT, or non-standard Auth methods.   
"multi" - Allows you to define multiple authentication methods at once  

* * *

## [#](<#client-id>) `client_id`

Attribute | Description  
---|---  
Key | `client_id`  
Type | lambda function  
Required | True if `type` is "oauth2". Ignored otherwise  
Description | Defines the client_id to use in Authorization URL and Token URL requests  
Possible Arguments | `connection` \- Hash representing user given inputs defined in `Connection`  
Expected Output | `String` i.e. `#{connection['client_id']}`  

* * *

## [#](<#client-secret>) `client_secret`

Attribute | Description  
---|---  
Key | `client_secret`  
Type | lambda function  
Required | True if `type` is "oauth2" and `acquire` is not defined. Ignored otherwise  
Description | Defines the client_secret to use in Token URL requests  
Possible Arguments | `connection` \- Hash representing user given inputs defined in `Connection`  
Expected Output | `String` i.e. `#{connection['client_secret']}`  

* * *

## [#](<#authorization-url>) `authorization_url`

Attribute | Description  
---|---  
Key | `authorization_url`  
Type | lambda function  
Required | True if the `type` is "oauth2"; ignored otherwise.  
Description | Denotes the authorization URL that users should be sent to in OAuth 2.0 Auth code grant flow.  
Possible Arguments | `connection` \- Hash representing user-given inputs defined in `Connection`.  
Expected Output | `String`   
Example: `"https://podio.com/oauth/authorize"`   
or `"#{connection['domain']}/oauth/authorize"`  

Workato automatically appends these standard OAuth 2.0 parameters for the authorization URL:

state
    The state to protect against CSRF attacks. Don’t configure this, as Workato uses the state to route the callback request properly.
redirect_uri
    Set to `https://www.workato.com/oauth/callback`; does not have to be configured.

Configure the following query parameter manually: 

response_type
    This query parameter must be set to `code`. 
    Example: 
```ruby

    authorization_url: lambda do |connection| "<https://acme.com/api/oauth/authorization?response_type=code>[  (opens new window)](<https://acme.com/api/oauth/authorization?response_type=code>)"
    end,


```

You may chose to include scope in your Authorization URLs.

* * *

## [#](<#token-url>) `token_url`

Attribute | Description  
---|---  
Key | `token_url`  
Type | lambda function  
Required | True if `type` is "oauth2" and `acquire` is not defined. Ignored otherwise.  
Description | Denotes the token URL that used to receive an access_token  
Possible Arguments | `connection` \- Hash representing user given inputs defined in `Connection`  
Expected Output | `String`   
i.e. `"https://podio.com/oauth/token"`   
or `"#{connection['domain']}/oauth/token"`  

Workato automatically appends the following standard OAuth 2.0 parameters for the token URL: 

grant_type
    Always set to `authorization_code`
code
    The authorization code received from authorization url callback
redirect_uri
    Set to `https://www.workato.com/oauth/callback` and does not have to be configured
client_id
    Inferred from the `client_id` lambda, if present.
client_secret
    This is inferred from the `client_secret`lambda, if present.

* * *

## [#](<#acquire>) `acquire`

Attribute | Description  
---|---  
Key | `acquire`  
Type | lambda function  
Required | True if `type` is "custom_auth".   
Optional if `type` is "oauth2"   
Ignored otherwise  
Description | If `type` is "custom_auth", the `acquire` lambda function is only run if `refresh_on` or `detect_on` is triggered.   
If `type` is "oauth2", the `acquire` lambda function is run after we receive the callback from the authorization_url.  
Possible Arguments | `connection` \- Hash representing user given inputs defined in `Connection`   
`auth_code` \- Only applicable if `type` is "oauth2". String representing the auth_code received from Authorization URL callback.   
`redirect_uri` \- Provides the appropriate redirect URI based on the Workato DC you are in. e.g. US DC would be `https://www.workato.com/oauth/callback`.   
`verifier` \- Used only in PKCE authentication, whereby you will have access to the verifier defined in the `pkce` lambda.  
Expected Output | **Variable - see examples below.**  
Example - acquire: - type: "oauth2"

If you specify `type` as "oauth2", the `acquire` block expects the output as an array of hashes. The array must contain the following values, in sequence:

Tokens
    Tokens must be in a hash with exact key names: `access_token`, `refresh_token` and `refresh_token_expires_in`.
Owner ID
    This is an optional value used for clobber detection; if not used, substitute with nil.
Other values
    If the API returns tokens with other keys, such as `id_access` and `id_refresh`, you can map them here. Supply an optional hash that can be merged with the original `connection` hash.
```ruby
 
        acquire: lambda do |connection, auth_code|
          response = post("https://login.mypurecloud.com/oauth/token").
            payload(
              grant_type: "authorization_code",
              code: auth_code,
              redirect_uri: "https://www.workato.com/oauth/callback"
            )
          [
            { # This hash is for your tokens
          	  access_token: response["access_token"],
          	  refresh_token: response["refresh_token"],
              refresh_token_expires_in: response["refresh_token_expires_in"]
          	},
            # This hash is for your Owner ID. It is optional
          	nil,
            # This is for any other value you want to append to your connection object which you can reference later on.
          	{ instance_id: nil }
          ]
        end,


```

The key `refresh_token_expires_in` which denotes the seconds from now that the refresh token will expire. Since Workato only knows to refresh connections when there are jobs, there are cases where short lived refresh tokens may be expired for recipes where jobs come infrequently. For example, if the refresh token expires in 1 week and the recipe is only run once every 2 weeks, both the connection's access and refresh tokens would have expired by the time the recipe is run.

If the key `refresh_token_expires_in` is supplied, Workato will refresh the connection automatically without the need for any jobs, preserving the connection for as long as needed. There is no need to add a buffer to this time as Workato already adds a buffer to this time. For example, if the `refresh_token_expires_in` is 100 seconds, we would refresh the connection at the 85 second mark.

In some cases, APIs may not respond with expiration times for the refresh token or may respond in actual timestamps. You may also artificially create the `refresh_token_expires_in` value if you know the validity of the refresh token.
```ruby
 
        acquire: lambda do |connection, auth_code|
          response = post("https://login.mypurecloud.com/oauth/token").
            payload(
              grant_type: "authorization_code",
              code: auth_code,
              redirect_uri: "https://www.workato.com/oauth/callback"
            )
          [
            { # This hash is for your tokens
          	  access_token: response["access_token"],
          	  refresh_token: response["refresh_token"],
              refresh_token_expires_in: 604800 # Value in seconds. You can provide the value manually as well.
          	},
            # This hash is for your Owner ID. It is optional
          	nil,
            # This is for any other value you want to append to your connection object which you can reference later on.
          	{ instance_id: nil }
          ]
        end,


```

Example - acquire: - type: "custom_auth"

If you specify `type` as "custom_auth", the `acquire` lambda function expects the output as a single hash. Workato then merges the output into the original `connection` hash.
```ruby
 
      authorization: {
        acquire: lambda do |connection|
          {
            authtoken: get('https://accounts.zoho.com/apiauthtoken/nb/create')
          }
        end,

        refresh_on: 401


```

Original `connection` hash:
```ruby
 
        {
          "email": "[[email protected]](</cdn-cgi/l/email-protection>)", # Given by User
          "password": "pinkfloyd" # Given by User
        }


```

When the user clicks the "Connect" button, Workato invokes the `test` lambda with the `connection` hash. If the `test` lambda fails with error code `401` (for example), Workato runs the `acquire` block.

After running the `acquire` block, the `connection` hash looks like this:
```ruby
 
        {
          "email": "[[email protected]](</cdn-cgi/l/email-protection>)", # Given by User
          "password": "pinkfloyd" # Given by User
          "authtoken": "SAMPLE_TOKEN"
        }


```

Workato then attempts to invoke the `test` lambda again, with the new `connection` hash. If the `test` lambda succeeds, the connection appears as `Successful`.

Workato runs `acquire` only when the system triggers `refresh_on`, because `connection` hashes may have valid tokens. Examples:

  * When the user disconnects from a valid connection that has an `authtoken` value
  * When the user clicks **Connect** , and Workato attempts to use this `authtoken` instead of using a new one

* * *

## [#](<#apply>) `apply`

Attribute | Description  
---|---  
Key | `apply`  
Type | lambda function  
Required | True  
Description | Defines the authentication parameters Workato adds to subsequent HTTP requests in the connector.  
Possible arguments | 

  * `connection` \- Hash representing user given inputs defined in `Connection`.
  * `access_token` \- Only applicable if `type` is "oauth2". Represents the `access_token` received from Token URL or `acquire` block.

Example - apply

The `apply` block's lambda function can output multiple commands to attach authorization parameters to all requests. The following example illustrates common methods:
```ruby
 
        apply: lambda do |connection|
          # Adds in URL parameters passed as a hash object
          # i.e. authtoken=[connection['authtoken']]
          params(authtoken: connection['authtoken'])

          #Adds in payload fields (PATCH, POST, PUT only) passed as hash
          payload(grant_type: "authorization_code",
                  client_id: connection["client_id"],
                  client_secret: connection["client_secret"],
                  code: auth_code)

          # Adds in headers into every request passed as a hash.
          # The variable access_token can be retrieved from input prompts defined in the 'fields' schema earlier or a return from the acquire block
          # i.e. Authorization : Bearer [given access token]
          headers("Authorization": "Bearer #{connection["access_token"]}")

          # Used in conjunction with password function
          # i.e. sends the input as username and password in HTTP authentication
          user(connection["username"])
          password(connection["username"])
        end


```

ACCESS AND MODIFY THE PAYLOAD OF A CURRENT REQUEST

You can use the `apply` method to access and modify the payload of a current request. This is useful when you plan to update an existing payload or copy information into the header.

The following example demonstrates how to add a `user_id` from the connection to the payload before the final request is sent:
```ruby
 
    apply: lambda do |connection|
      if connection['user_id'].present? # Check if user_id exists in the connection
        params = {}
        payload do |current_payload| # Access the current payload
          params = current_payload.dig('params') # Extract the params hash
        end
        params['user'] = connection['user_id'] # Insert user_id from the connection
        payload({ "params": params }) # Merge the updated params into the payload
      end
    end


```

Here are special variables that you can call in the `apply` lambda function: 

`current_url`
    Enables matches on the current URL, and applies proper authentication.

```ruby

    apply: lambda do |_connection, access_token|
    if current_url.include?('<https://developer.api.autodesk.com/cost/>[  (opens new window)](<https://developer.api.autodesk.com/cost/>)')
    headers('Authorization': "Bearer #{access_token}", 'Content-Type' => 'application/json')
    else
    headers('Authorization': "Bearer #{access_token}", 'Content-Type' => 'application/vnd.api+json')
    end
    end


```

`current_verb`
    Enables matches on the current HTTP verb, and applies proper authentication.

```ruby

    apply: lambda do |_connection, access_token|
    if current_verb.include?('GET')
    headers('Authorization': "Bearer #{access_token}", 'Content-Type' => 'application/json')
    else
    headers('Authorization': "Bearer #{access_token}", 'Content-Type' => 'application/vnd.api+json')
    end
    end

```

* * *

## [#](<#refresh-on>) `refresh_on`

This is an optional array of signals that identify when the system must re-acquire credentials. When it receives an error response (400, 401, 500...), the SDK framework checks the list of signals. If it finds a match, it triggers a re-authorization by running either the `refresh` lambda function for `type: oauth2` connections, or the `acquire` block for `type: custom_auth` connections.

Attribute | Description  
---|---  
Key | `refresh_on`  
Type | Array  
Required | False. If not defined, will default to one attempt at re-acquiring credentials for all errors.  
Description | Tells Workato when to refresh authentication credentials. This accepts an array of integers which are matched to HTTP response codes or Regex expressions which are matched on the response body.  
Expected Output | Array of ints or strings - `[ 401, /Unauthorized/ ]`  
Example - `refresh_on`:

This example demonstrates the multiple approaches for defining what "signals" to watch.

401
    The response status code
"Unauthorized"
    The exact string that matches the whole body or title of the response
/Unauthorized/
    The regex expression that matches the body or title of the response
```ruby
 
        refresh_on: [
          401,
          'Unauthorized',
          /Unauthorized/,
          /Invalid Ticket Id/
        ]


```

* * *

## [#](<#detect-on>) `detect_on`

Some APIs don't signal errors with explicit response status code, such as `401`. Instead, they return a `200` (pseudo- successful response) with a payload that signals the error.

For such APIs, Workato does not pick up an error (expired credentials, bad requests, and so on); it interprets it as a successful request because of the `200`response code. However, a match with signals raises an error. When it finds a match, two things can happen:

  1. There can also be a match with `refresh_on` signals. This triggers a re-authorization where the `acquire` block runs instead of the system raising an error. Then, `detect_on` matches errors that hide behind the `200` response code to identify that the system must refresh the credentials.

  2. If there is no match with signals that are defined in `refresh_on`, the system raises an error.

Attribute | Description  
---|---  
Key | `detect_on`  
Type | Array  
Required | False  
Description | Tells Workato when to raise an error due to a signal in the response to a request. This accepts an array of integers which are matched to HTTP response codes or Regex expressions which are matched on the response body.  
Expected Output | Array of ints or strings - `[ 401, /Unauthorized/ ]`  
Example - detect_on

This example demonstrates multiple approaches for defining "signals" to watch in `detect_on`.

"sample error message"
    The exact string that matches the whole body or title of the response
/^\\{"response":\\{"error".+$/
    Regex expression that matches the body or title of the response
```ruby
 
        detect_on: [
          "sample error message",
          /^\{"response":\{"error".+$/
        ]


```

* * *

## [#](<#refresh>) `refresh`

This lambda applies only to `type: "oauth2"` connections.

In many situations, the API expires the access token after a prescribed amount of time. The system then uses a refresh token to obtain a new access token. Refresh tokens do not expire, usually.

Not all APIs issue refresh token credentials. Check with your provider about this requirement.

Attribute | Description  
---|---  
Key | `refresh`  
Type | lambda function  
Required | False but recommended and only valid for `type: oauth2` connections.  
Description | This function will be executed if we either receive a non 2XX response in any API request, the `refresh_on` signal is triggered or if Workato knows that the refresh token is about to expire. This is used to obtain new access tokens. If this is not defined, Workato attempts to use the standard OAuth 2.0 refresh mechanism where possible or reruns the `acquire` lambda function.  
Possible Arguments | `connection` \- Hash representing user given inputs defined in `Connection`   
`refresh_token` \- Represents the `refresh_token` received from Token URL or `acquire` block.  
Expected Output | A hash that contains a new access token. Optionally this hash can include a new refresh token (which will override the original refresh token) and a time delay before Workato refreshes the access token and refresh token. See the example below.  
Example - refresh

If you specify `type:` as "oauth2", the `refresh` block expects the output as a hash. This hash must include the keys for `access_token`, and potentially for `refresh_token` if the system creates a new refresh token each time.

It is also recommended you include the key `refresh_token_expires_in` which denotes the seconds from now that the refresh token will expire. Since Workato only knows to refresh connections when there are jobs, there are cases where short lived refresh tokens may be expired for recipes where jobs come infrequently. For example, if the refresh token expires in 1 week and the recipe is only run once every 2 weeks, both the connection's access and refresh tokens would have expired by the time the recipe is run.

If the key `refresh_token_expires_in` is supplied, Workato will refresh the connection automatically without the need for any jobs, preserving the connection for as long as needed. There is no need to add a buffer to this time as Workato already adds a buffer to this time. For example, if the `refresh_token_expires_in` is 100 seconds, we would refresh the connection at the 85 second mark.

For example, if the response from the refresh token url is as follows:
```ruby
 
    {
      "access_token": "new_access_token",
      "refresh_token": "new_refresh_token",
      "refresh_token_expires_in": 604800 
    }


```

Then you should configure the HTTP request for the API call in the following manner:
```ruby
 
          refresh: lambda do |connection, refresh_token|
            url = "https://#{connection['custom_domain'].presence || 'go.trackvia.com'}"
            response = post("#{url}/oauth/token").payload(
              client_id: connection['client_id'],
              client_secret: connection['client_secret'],
              grant_type: 'refresh_token',
              refresh_token: refresh_token
            ).request_format_www_form_urlencoded
          end,


```

Alternatively, to return an array of hashes that override or add new values to your connection hash, implement something like this:
```ruby
 
        refresh: lambda do |connection, refresh_token|
          url = "https://#{connection['custom_domain'].presence || 'go.trackvia.com'}"
          response = post("#{url}/oauth/token").payload(
            client_id: connection['client_id'],
            client_secret: connection['client_secret'],
            grant_type: 'refresh_token',
            refresh_token: refresh_token
          ).request_format_www_form_urlencoded

          [
            { # This hash is for your tokens
              access_token: response["access_token"],
              refresh_token: response["refresh_token"],
              refresh_token_expires_in: response["refresh_token_expires_in"]
            },
            {
              user_key: user_key # Will be merged into connection hash
            }
          ]
        end,


```

In some cases, APIs may not respond with expiration times for the refresh token or may respond in actual timestamps. You may also artificially create the `refresh_token_expires_in` value if you know the validity of the refresh token.
```ruby
 
        refresh: lambda do |connection, refresh_token|
          url = "https://#{connection['custom_domain'].presence || 'go.trackvia.com'}"
          response = post("#{url}/oauth/token").payload(
            client_id: connection['client_id'],
            client_secret: connection['client_secret'],
            grant_type: 'refresh_token',
            refresh_token: refresh_token
          ).request_format_www_form_urlencoded

          [
            { # This hash is for your tokens
              access_token: response["access_token"],
              refresh_token: response["refresh_token"],
              refresh_token_expires_in: 604800 # Value in seconds. You can provide the value manually as well.
            },
            {
              user_key: user_key # Will be merged into connection hash
            }
          ]
        end,


```

* * *

## [#](<#identity>) `identity`

The `identity` lambda displays additional information about the connection. This output appears on the connection page, providing extra context about the authenticated user or connection.

![](/assets/img/identity_lambda.ff4f3859.png)

Attribute | Description  
---|---  
Key | `identity`  
Type | Lambda function  
Required | False.  
Description | The lambda allows you to display additional information about the connection object. You can make an HTTP request to retrieve user identity details, or reference existing values from the connection object. Refer to the [acquire lambda documentation](</developing-connectors/sdk/sdk-reference/connection/authorization.html#acquire>) for details on appending values from the acquire lambda to the connection object. You can reference these values in the `identity` lambda.  
Possible arguments | `connection` \- A hash representing inputs defined in the `Connection` object.  
Expected output | A string containing details about the connection (for example, "[[email protected]](</cdn-cgi/l/email-protection#96e3e5f3e4d6f3eef7fbe6faf3b8f5f9fb>)", "Refresh token expires in 86400 seconds")  
Example - identity

In this example, the `identity` lambda makes an HTTP GET request to retrieve user information from a third-party API. It extracts the user’s email and displays it on the connection page. Use this when the connection object doesn't directly include the email.
```ruby
 
          identity: lambda do |_connection|
            get("https://app.asana.com/api/1.0/users/me")["data"]["email"]
          end,


```

You can also use this lambda to return values from the connection object. The following example retrieves the `username` from the connection object:
```ruby
 
          identity: lambda do |connection|
            connection["username"]
          end,


```

Additionally, you can customize the output of the lambda using values from the connection object to provide detailed information. The following example fetches the Company ID and displays a formatted string on the connection page:
```ruby
 
          identity: lambda do |connection|
            "Company ID: #{connection['company_id']}"
          end,


```

* * *

## [#](<#pkce>) `pkce`

This lambda applies only to `type: "oauth2"` connections and is only needed when OAuth2 Authorization code grant with PKCE authentication is needed. This lambda allows you to defined the parameters for PKCE such as the code verifier, code challenge and challenge method.

Attribute | Description  
---|---  
Key | `pkce`  
Type | lambda function  
Required | False. Only needed for Auth code grant flows with PKCE  
Description | This lambda allows you to set the parameters for the PKCE flow. It receives 2 arguments, `verifier` and `challenge`, where the `verifier` is an opaque string of 128 characters and the `challenge` is a url safe string that is the SHA256 of the verifier. In some cases, if you need a longer or shorter verifier, you can supply your own.  
Possible Arguments | `verifier` \- Opaque string of 128 characters.   
`challenge` \- SHA256 of the `verifier`  
Expected Output | Hash which contains 3 attributes, `verifier`, `challenge` and `challenge_method`.  

[Learn more about creating Authorization Code Grant flows with PKCE](</developing-connectors/sdk/guides/authentication/oauth/auth-code-pkce.html>).

* * *

## [#](<#selected>) `selected`

This lambda applies only to `type: "multi"` connections.

Use this lambda when defining `type: "multi"`; specify which inputs in the original inputs fields map to the correct Authentication type. Use this together with a declared `options`.

If `selected` is not defined but `type: "multi"` is defined, Workato defaults to any input with the internal name:`name: "auth_type"`

Attribute | Description  
---|---  
Key | `selected`  
Type | lambda function  
Required | False. Required for `type: "multi"` connections.  
Description | Workato runs this function will be executed based on the inputs given in `fields` and should output a string that will match against a key defined in the `options` hash. Defaults to the field with `auth_type` as the internal name.  
Possible Arguments | `connection` \- Hash representing user given inputs defined in `Connection`  
Expected Output | A string that matches any keys defined in the `options` hash.  

* * *

## [#](<#options>) `options`

This lambda applies only to `type: "multi"` connections.

This hash contains the definition of multiple authentication flows when you plan a connector that supports multiple authentication types.

Attribute | Description  
---|---  
Key | `options`  
Type | Hash  
Required | False. Required for `type: "multi"` connections.  
Description | Hash that contains the definitions of the various authentication types within a "multi" authentication flow connector.  
Schema for nested authentication definitions

Consider the schema with nested authentication definitions:
```ruby
 
      options: {
        [unique_option_name]: {
            type: String,

            fields: Array,

            client_id: lambda do |connection|
              String
            end,

            client_secret: lambda do |connection|
              String
            end,

            authorization_url: lambda do |connection|
              String
            end,

            token_url: lambda do |connection|
              String
            end,

            acquire: lambda do |connection, auth_code|
              Hash or Array
            end,

            apply: lambda do |connection, access_token|
              # see apply documentation for more information
            end,

            refresh_on: Array,

            detect_on: Array,

            refresh: lambda do |connection, refresh_token|
              Hash or Array
            end,
        },

        [Another_unique_option_name]: {
            ...
        }
      }


```

Within the `options` hash, you must define two components for an authentication flow:

  1. The _**key**_ that is unique to the authentication flow
  2. The _**mechanics**_ of the authentication flow that is similar to an entirely new `authorization` hash.

Consider this example:
```ruby
 
        fields: [
          {
            name: "auth_type",
            control_type: "select",
            pick_list: [["OAuth2", "stripe_oauth2"], ["API Key", "stripe_api_key"]],
            default: "api_key",
            extends_schema: true
          }
        ],
        authorization: {

          type: "multi",

          selected: lambda do |connection|
            connection["auth_type"]
          end,

          options: {
            stripe_oauth2: {
              type: "oauth2",

              fields: [
                { name: 'authorization_url' },
                { name: 'token_url' },
                { name: 'client_id' },
                { name: 'client_secret' },
              ],

              authorization_url: lambda do |connection|
                connection['authorization_url']
              end,

              token_url: lambda do
                "https://api.stripe.com/accessToken"
              end,

              apply: lambda do |_, access_token|
                headers("Authorization": "OAuth2 #{access_token}")
              end,
            },

            stripe_api_key: {
              type: "custom_auth",

              fields: [
                {
                  name: "api_key",
                }
              ],

              apply: lambda do |connection|
                headers("Authorization": "Bearer" + " " + connection["api_key"])
              end
            }
          },
        },


```

Here, you we defined 2 authentication flows, `stripe_oauth2` and `stripe_api_key`. These keys can be anything as long as they match the output of the `selected` lambda. In each of the flows, you can see and define all lambdas in the hash. For the `stripe_oauth2` option, we defined the `type` of the authentication flow as `oauth2`, `authorization_url`, `token_url` and the `apply` block.

The significant difference here is that you can define an additional `fields` key inside each authentication flow. This adds more input fields that are based on the selected authentication method; Workato adds these fields automatically.

* * *

## [#](<#noopener>) `noopener`

The `noopener` attribute applies only to OAuth 2.0 connections.

It specifies the `rel="noopener"` HTML attribute. This attribute improves security by adding `rel="noopener"` to links that open in a new browser tab or window.

Attribute | Description  
---|---  
Key | `noopener`  
Type | Boolean  
Required | No. Defaults to `false`. Users can set to `true` for enhanced security.  
Description | When set to `true`, the OAuth 2.0 authorization page launches with `target="blank"` and `rel="noopener"` attributes. This attribute improves security and prevents linked third-party websites from taking control of the browser tab through the window object.

```

### references/sdk-reference__schema.md

```markdown
# Workato SDK Documentation

> **Source**: https://docs.workato.com/en/developing-connectors/sdk/sdk-reference/schema.html
> **Fetched**: 2026-01-18T02:50:35.280283

---

# [#](<#sdk-reference-workato-schema>) SDK Reference - Workato Schema

The following section defines how to define input and output fields in Workato - collectively called "Schema". You can apply this information anywhere in your connector code where input fields or output fields (datapills) are defined. This could be in places such as `connection`, `actions`, `triggers`, and `object_definitions`

Quick Overview

Getting the hang of Workato schema is essential for building user-friendly and intuitive connectors. You can give various attributes to your connector to make it easier to use. This schema is a simple array of hashes where each index in the array represents a single input field or output field.

These definitions are completely interchangeable for both input and output fields, making it easier to write the schema once and reuse it.

## [#](<#structure>) Structure
```ruby
 
      [
        {
          name: String,
          label: String,
          optional: Boolean,
          type: String,
          hint: String,
          of: String,
          properties: Array,
          control_type: String,
          toggle_hint: String,
          toggle_field: Hash,
          default: String,
          pick_list: String,
          delimiter: String,
          sticky: Boolean,
          convert_input: String,
          convert_output: String,
          change_on_blur: Boolean,
          support_pills: Boolean,
          custom: Boolean,
          extends_schema: Boolean,
          list_mode: String,
          list_mode_toggle: Boolean,
          item_label: String,
          add_field_label: String,
          empty_schema_message: String,
          sample_data_type: String,
          ngIf: String
        },
        {
          # Another field definition
        }
      ]


```

* * *

## [#](<#attribute-description>) Attribute description

Key | Definition  
---|---  
name | Required. The name of this field. For example, id or created_at  
optional | Optional. Default is false. Applies to input fields and ensures users provide input for this field before running the recipe.  
label | Optional. All fields have default labels based on the field name. Use this to change the default value of the field label.  
hint | Optional. This allows you to add some hints below the input field to guide the user. Links to documentation can be given using HTML syntax.  
type | Optional. The data type of this field. Default value is "string". Possible values are:   
\- "string"   
\- "integer"   
\- "number"   
\- "date_time"   
\- "date"   
\- "timestamp"   
\- "boolean"   
\- "object" - Must be accompanied by `properties`   
\- "array" - Must be accompanied by `of`  
of | Optional except when `type: "array"`. Used in conjunction with Arrays to define the data type of the Array. Possible values are:   
\- "string"   
\- "integer"   
\- "number"   
\- "date_time"   
\- "date"   
\- "timestamp"   
\- "boolean"   
\- "object" - Denotes an array of objects. Must be accompanied by the `properties` attribute.  
properties | Optional except when `type: "object"` or when `type: "array"` and `of: "object"`. Accepts an array of schema to denote the properties of the object.  
control_type | Optional. This field relates only to input fields, and it dictates the input field type to expose in a recipe. Default is "string". When this schema is used as an output field, this attribute is ignored.   
Refer to the list of [supported control types](</developing-connectors/sdk/sdk-reference/schema.html#control-types>).  
toggle_hint | Optional. This represents the label of the primary toggle. See [toggle fields](<#using-toggle-fields>) for more information.  
toggle_field | Optional. Hash representing the secondary toggle for this input field. See [toggle fields](<#using-toggle-fields>) for more information.  
default | Optional. Allows you to set a default value for that input field.  
pick_list | Optional. If control_type is :select or :multiselect, this property is required. Allows you to reference a picklist defined in the `pick_lists` key or define one directly. If defining a picklist directly, provide the same 2D array described [here](</developing-connectors/sdk/sdk-reference/picklists.html>)  
options | Synonymous with pick_list and used only for `connection` input fields.  
delimiter: | Optional unless `control_type: "multiselect"`. This delimiter is used between each input the user provides.  
sticky | Optional. Use this property to make this field always visible as an input field. By default, inputs that are optional are hidden inside the optional fields drop-down. Use `sticky: true` so they show up beside required fields.  
convert_input | Optional. When defining input fields, values passed into these fields are assumed to be strings regardless of their `type` defined. `convert_input` allows you to convert and transform these inputs even before they are passed to your `execute` block's `input` argument. [Learn more](<#using-convert-input-and-convert-output-for-easy-transformations>)  
convert_output | Optional. When defining output fields, the `name` of each field is matched against the keys in the actual output of the `execute` lambda function. This does not, however, ensure that the `value` of the output matches the `type` declared for its matched field. `convert_output` allows you to convert and transform these inputs as well as correctly "cast" incoming values assigned to a specific output field. [Learn more](<#using-convert-input-and-convert-output-for-easy-transformations>)  
change_on_blur | Optional. When true, config fields and dependent fields only evaluate the value when the user blurs out of the field instead of after every keystroke. This parameter often doesn't need to be configured.  
support_pills | Optional. The default value is true. When false, this field doesn't allow datapills to be mapped to it. This parameter often doesn't need to be configured.  
custom | Optional. When true, a special marker is introduced to indicate to the user that this field is custom. Normally used when dynamically generating object definitions which may contain custom fields.  
extends_schema | Optional. Allows a field to behave like a `config_field`  
list_mode | Optional. Used when `type: "array"` and `of: "object"`. Workato defaults to dynamic lists but this parameter allows you to set this input field to a static array input field. Possible values are:   
\- "static" - Users must define each index in this array.   
\- "dynamic" - Users can dynamically define each index in this array using list datapills.  
list_mode_toggle | Optional. Used when `type: "array"` and `of: "object"`. Allows users to toggle between static and dynamic lists when working with arrays. Defaults to true. Set list_mode_toggle: false to disallow users to toggle list modes.  
item_label | Optional. Only used with `control_type: "schema-designer"` or `control_type: "key_value"`. This allows you to configure the item name stated in the modal popup. Setting item_label: "Item Label" results in the following: ![](/assets/img/item_label.dca2262f.png)  
add_field_label | Optional. Only used with `control_type: "schema-designer"` or `control_type: "key_value"`. This allows you to configure the label of the add button. Setting add_field_label: "Custom Add Label" results in the following: ![](/assets/img/add_field_label.51f61bc5.png)  
empty_schema_message | Optional. Only used with `control_type: "schema-designer"` or `control_type: "key_value"`. This allows you to configure the message when the input field is empty. Setting empty_schema_message: `Custom empty schema message that allows to add field and generate schema` results in the following: ![](/assets/img/empty_schema_message.699396d6.png)  
sample_data_type | Optional. Only used with `control_type: "schema-designer"`. This allows you to configure the type of data the schema-designer input field accepts. Setting `sample_data_type: csv` results in the following: ![](/assets/img/sample_data_type.a34390ce.png) Other possible inputs are json_input and xml. The schema-designer defaults to json_input.  
ngIf | Optional. Allows you to define a boolean statement. If true, this field displays. The boolean statement can reference other inputs in the same schema. For example, `ngIf: 'input.object_name != "approval"'` where the root node is `input` and you can traverse to a specific field via dot notation. Click [here](<#using-ngif-to-conditionally-hide-or-display-fields>) for more details.  
tree_options | Optional. Only used when `control_type: 'tree'`. This allows you to control the behavior of the `tree` picklist. This key expects a Hash which has three possible keys - `selectable_folder`,`multi_select` and `force_selection_hierarchy`. Find out more [here](</developing-connectors/sdk/sdk-reference/picklists.html>).  

## [#](<#control-types>) Control types

The `control_type` key affects how users configure the input fields you define. For each input field (index in the schema array), you can control its look by assigning one of the values to the `control_type` attribute:

Control type | Description  
---|---  
text |  Simple text input field with a formula mode option.  
![text control type](data:image/png;base64,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)  
text-area |  Long text input field with a formula mode option.  
![text-area control type](data:image/png;base64,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)  
plain-text |  Simple text input field without a formula mode option.  
![plain-text control type](data:image/png;base64,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A5dkf14RHzxr0JDD43KPJLl8afy7/1n9slFa/osfY7Lty/FFzv3z4elBa7HzYU6tQe1krQfLRkzu7VMWjWip6gcyGpfNHtZ9xzEdP6A2ZOWy2ZXf9M7Opq2cXXk3Fy2b3enJQxbN7vmdXtSyqtMPg8+b3x5OoCaz9j83ao/S2o6SgWEdrcoYE17FbxoBsvbfZGfTngZTM9ZV1m7oOZuArK0vdfce1NPdC9bVIGvITef5HoCsvRasmux/H/C6yhqArAGyBiBrALIGIGsAsgbIGoCsAcgagKwByBogawCyBiBrALIGIGuArAHIGoCsAcgawKvLWktbaz1AH9Da1lJN1lp8UkDf0VJF1trql4/dAKAPGLu8vq2KrLXWqxrQV7pW31pF1urrfVJAX1FfL2uArAHIGoCsAcgagKwBsgYgawCyBiBrALIGyBqArAHIGoCsAcgaIGsAsgYgawCyBiBrgKwByBqArAHIGoCsAbIma4CsAcgagKwByBoga7IGyBqArAHIGoCsAbIma4CsAcgagKwByBoga7IGyBqArAHIGoCsAbIma4CsAcgagKwByBoga7IGyBqArAHIGoCsAbIma4CsAcgagKwByBoga7IGyBqArAHIGoCsAbIma4CsAcgagKwByBoga7IGyBqArAHIGoCsAbIma4CsAcgagKwByBoga7IGyBpAX85aa/1YnxTQN4ytb60ia231y3UN6BtVW17fVkXWWuoB+oyWKrKWtLS1+qSAvqC1rUvVXiFrAH2WrAGyBiBrALIGIGsAsgbIGoCsAcgagKwByBogawCyBiBrALIGIGuArAHIGoCsAcgagKwBsgYgawCyBiBrALIGyBqArAHIGsA68R/lCqbFVacfIQAAAABJRU5ErkJggg==)  
plain-text-area |  Long text input field with formula mode option. This input field can be expanded using the adjust icon.  
![plain-text-area control type](data:image/png;base64,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)  
password |  Text input field specifically designed for sensitive information, such as passwords. Text input in this control type is masked.  
![password control type](data:image/png;base64,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)  
integer |  Simple number field with icon to indicate an integer value. This control type has a formula mode option.  
![integer control type](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAuUAAABqCAMAAAAsnd/oAAABR1BMVEUeO0UpRE4wS1Q6VF0+Vl9BWWJEXGVHX2hMY2xXbXVXb3tacHdec3pfdHxgdoJkeIBleYBne4JofYhofolqfYRrfoVwhY9xhZB3iZB4ipB5ipF5jJaAkJaAkZeBk52CkpmClJ2JmJ6Kmp+Km6SNnKGPnaOPnqSSoKaToaeToqqToquWlpaYpquZp6ybqbGcqrKdqq+grLGhrbKksLWksbilsbamsbaotLiptLmrtrqst7ysuL+vub6wur+xu7+xvMW1vsO1v8a3wcm6w8e7xMy9xsq9xs6+x83AyMzByc3Dy87Ey8/GztPHztLI0NPKysrL0tXM09bP1dnP1drR19rT2dzW297X3N/X3eHZ3uPb4OLf4+bg4ODg5Ojg5efi5unj5+nl6Ovl6evn6u3o6+3p7O7s7/Ht7/Lv8fPw8vTx8/Tx8/X///8GPv3oAAACrUlEQVR42u3d208UBxTA4cPWBZ0qVamITqFQrBUv9CKoddVl1wvW2tLaYgVBpVKrjv//szPgg4nZpI/18H0JOft88svmzPCwUUF2YQWoHFQOKgeVg8pB5aByUDkqB5WDykHloHJQOagcPqj8+dKSlZC88sWI3+yE3JUfasXMzodX1fsD8lS+FRPtffU804r28LHq7v4YuWtF5Kr8StyYjAfVUhy5FK0f/4z26fbQMzsiVeWfxd+341T1ddyrDrSqL+L6X9+Fx1FSVb4dMdKO4epeHLwQh6uD0Vi0IzJVfi0OTU6OxOqz1vDIyafViVja2tr6147IVPnn8bCqLsU3V+P8z788qb/S2z9cnbEiMlX+Ipr3K49j//rOqfJ9dXko4tN/7IhUT5/vfDn06+83o11Vr9a3bYiclR+Oiz99FROWQ+LKVw9EfDLzwnJIXHl9qry0GbJXDioHlYPKQeWgclA5qByVQ97K1/pdyKG/NqDyO883/7PuG/g/6w+o/NamysmiO6DyrspRucpROagcVA4qB5WDylG5ylG5ylE5qBxUDioHlYPKUfkHld8vO83oTU/3mtkpp5dVTq7Kl0eL+WYUU+PF/TryYnZ89JHKSVX50dndyufr0Osv897CZq+pXeWkust3Kq/NF380Y2Fs1sVC0so7RWd3lmMuFnJW/i7yXq++XJZVTq6nz2+L5iVLpzhelvVdPlecPb57uaicNJV3yrKcq+uuR1P7o/lyyptE0l0s/iuEykHloHJQOagcVI7KVY7KVc5Ha2NF5WSP/NyGytkDkauc/JGrnOSRu8vJH7m7nD0RucpJa2Vj90/l7AVdv1BOeoN+oXyt34Uc+msDKoecVI7KQeWgclA5qBxUDiqHuvLXkJ3KUTmoHFQOKgeVg8pB5aByVA4ZvAWCidxA64uwygAAAABJRU5ErkJggg==)  
number |  Decimal number field with icon to indicate a float value. This control type has a formula mode option.  
![number control type](data:image/png;base64,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)  
url |  Text field with icon to indicate a URL value. This control type has a formula mode option.  
![url control type](data:image/png;base64,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)  
select |  Control type to provide a predefined list of values to choose from. Make sure to include the `pick_list` property.  
![select control type](/assets/img/select.5e01f27f.png)  
checkbox |  Simple Yes/No select interface. It is advisable to add a [toggle field](<#using-toggle-fields>) for dynamic mapping and formula mode option.  
![checkbox control type](/assets/img/checkbox.6b41b9ab.png)  
multiselect |  Control type similar to `select` with additional ability to select multiple values. This control type must be accompanied with `pick_list` and `delimiter` properties.  
![multiselect control type](/assets/img/multiselect.8464adf6.png)  
date |  Control type indicating date value. This control type has a formula mode option. ![date control type](/assets/img/date.0d4f5167.png)  
date_time |  Control type indicating date with time value. This control type has a formula mode option. ![date_time control type](/assets/img/date_time.eababa73.png)  
phone |  Control type indicating phone value. This control type has a formula mode option.  
![phone control type](data:image/png;base64,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)  
email |  Control type indicating email value. This control type has a formula mode option.  
![email control type](data:image/png;base64,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)  
subdomain |  Control type to indicate a subdomain of a particular site. Typically used in connection fields. Make sure to include the `url` property.  
![subdomain control type](data:image/png;base64,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)  
schema-designer |  Control type that allows you to collect schema information from users. This is useful when you need users to give your input during recipe design time to create input or output fields. This requires `extends_schema: true` to take effect. 
```ruby

    {
      name: "schema",
      extends_schema: true,
      schema_neutral: false,
      control_type: 'schema-designer',
      label: 'Schema designer label',
      hint: 'Hint for schema designer field',
      item_label: 'button',
      add_field_label: 'Custom Add Label',
      empty_schema_message: 'Custom empty schema message that allows to <button type="button" data-action="addField">add field</button> and <button type="button" data-action="generateSchema">generate schema</button>',
      sample_data_type: 'csv' # json_input / xml
    },

```

![schema-designer](/assets/img/schema_designer.c8e78b2a.png)  
key_value |  Control type that allows you to collect key and value pairs from users. This is useful when you need users to give your input during recipe design time for URL query parameters. Must be accompanied with `properties` defined and two inputs given. 
```ruby

    {
      name: "key_value",
      control_type: "key_value",
      label: "key_value",
      empty_list_title: "Add query parameters",
      empty_list_text: "Description for empty list",
      item_label: "Query parameter",
      type: "array",
      of: "object",
      properties: [
        { name: "key"},
        { name: "value"}
      ]
    },


```

![key_value](/assets/img/key_value.3c072fb1.png)  

## [#](<#nested-objects>) Nested objects

Often, data returned from API request is not a simple one-level JSON. More often than not, the returned JSON object is much more complex, with multiple levels of nesting. This section aims to illustrate how to define nested fields.

#### [#](<#sample-code-snippet>) Sample code snippet
```ruby
 
    {
      "id": "00ub0oNGTSWTBKOLGLNR",
      "status": "STAGED",
      "created": "2013-07-02T21:36:25.344Z",
      "activated": null,
      "lastLogin": "2013-07-02T21:36:25.344Z",
      "profile": {
        "firstName": "Isaac",
        "lastName": "Brock",
        "email": "[[email protected]](</cdn-cgi/l/email-protection>)",
        "login": "[[email protected]](</cdn-cgi/l/email-protection>)",
        "mobilePhone": "555-415-1337"
      },
      "credentials": {
        "provider": {
          "type": "OKTA",
          "name": "OKTA"
        }
      },
      "_links": {
        "activate": {
          "href": "https://your-domain.okta.com/api/v1/users/00ub0oNGTSWTBKOLGLNR/lifecycle/activate"
        }
      }
    }


```

Nested object field `profile` can be defined `type: :object` with fields nested inside using `properties`. Properties should be an array of fields objects (just like `fields` within the `user` object).
```ruby
 
    object_definitions: {
      user: {
        fields: lambda do
          [
            {
              name: "id"
            },
            {
              name: "status"
            },
            {
              name: "created",
              type: :timestamp
            },
            {
              name: "activated",
              type: :timestamp
            },
            {
              name: "lastLogin",
              type: :timestamp
            },
            {
              name: "profile",
              type: :object,
              properties: [
                {
                  name: "firstName"
                },
                {
                  name: "lastName"
                },
                {
                  name: "email",
                  control_type: :email
                },
                {
                  name: "login",
                  control_type: :email
                },
                {
                  name: "mobilePhone",
                  control_type: :phone
                }
              ]
            }
          ]
        end
      }
    }


```

## [#](<#nested-arrays>) Nested Arrays

The other common type of nested field is an array of objects. This type of field contains a list of repeated objects of the same fields. The defining such fields is similar to defining objects. Take the following sample `user` object from Asana as an example.

#### [#](<#sample-code-snippet-2>) Sample code snippet
```ruby
 
    {
      "data": {
        "id": 12149914544379,
        "email": "[[email protected]](</cdn-cgi/l/email-protection>)",
        "name": "Ee Shan",
        "workspaces": [
          {
            "id": 1041269201604,
            "name": "Workato"
          },
          {
            "id": 498346130780,
            "name": "Product Documentation"
          }
        ]
      }
    }


```

The `workspaces` array should be given `type: :array` as well as `of: :object`. This tells the `object_definitions` framework that the field contains an array of objects. Similar to nested objects, you must define `properties`, which is an array of fields corresponding to the fields of each object in the `workspaces` array.
```ruby
 
    object_definitions: {
      user: {
        fields: lambda do
          [
            {
              name: 'id',
              type: :integer
            },
            { name: 'name' },
            {
              name: 'email',
              control_type: :phone
            },
            {
              name: 'workspaces',
              type: :array,
              of: :object,
              properties: [
                {
                  name: 'id',
                  label: 'Workspace ID',
                  type: :integer
                },
                { name: 'name' }
              ]
            }
          ]
        end
      }
    }


```

## [#](<#using-toggle-fields>) Using toggle fields

Toggle fields are a special type of input fields that allow 2 input types. They are a great way to introduce greater flexibility and increase usability in your input fields. When used, toggle fields allow users to switch between two control types.

TIP

Toggle fields are often used in conjunction with pick lists. Since pick lists produce drop-downs, users are unable to map datapills which they normally would in recipes. Toggle fields fix that by allowing them to toggle to plain text fields which can accept datapills.

#### [#](<#sample-code-snippet-3>) Sample code snippet
```ruby
 
        input_fields: lambda do |object_definition, connection, config_fields|
          {
            name: "parser_id",
            label: "Document Parser",
            hint: "The Document Parser the file gets imported to",
            control_type: :select,
            pick_list: "parsers",
            optional: false,
            toggle_hint: "Select from list",
            toggle_field: {
              name: "parser_id",
              label: "Parser ID",
              type: :string,
              control_type: "text",
              optional: false,
              toggle_hint: "Use Parser ID",
              hint: "Go to home page and select the required parser. If the URL is 'https://app.docparser.com/stack/ynrqkdxvaghs/overview', then 'ynrqkdxvaghs' is the ID"
            }
          },
        end


```

![toggle primary](/assets/img/toggle-primary.1dad62f3.png) _Primary toggle field_

![toggle secondary](/assets/img/toggle-secondary.dfff2bce.png) _Secondary toggle field_

You can use a picklist input type to create a customized user experience. However, this makes the action value mapping static. All recipe jobs executing this action use the single parser ID value you selected, because only one value can be selected from the picklist. You can avoid this limitation by using a text field. A text field allows you to dynamically map the input field value.

If both field types are preferred for your planned use case, you can use the `toggle_field` to provide both input options to users. The picklist type is set as the primary toggle and the text field is set as the secondary (nested `toggle_field`) because the most common scenario is for users to select one parser per action.

## [#](<#using-fields-with-extends-schema>) Using fields with extends_schema

In some cases, the input fields you plan to show in an action depend on the answer to an input field in the same action. The `extends_schema` feature enables you to add dynamic behavior to your actions without using configuration fields.

#### [#](<#sample-code-snippet-4>) Sample code snippet
```ruby
 
    object_definitions:
      schema_input: {
        fields: lambda do |connection, config_fields, object_definitions|
          input_schema = parse_json(config_fields.dig('schema') || '[]')
          [
            {
              name: "schema",
              extends_schema: true,
              schema_neutral: false,
              control_type: 'schema-designer',
              label: 'Schema designer label',
              hint: 'Hint for schema designer field',
              item_label: 'button',
              add_field_label: 'Custom Add Label',
              empty_schema_message: 'Custom empty schema message that allows to <button type="button" data-action="addField">add field</button> and <button type="button" data-action="generateSchema">generate schema</button>',
              sample_data_type: 'csv' # json_input / xml
            },
            if input_schema.present?
              { name: 'data', type: 'object', properties: input_schema }
            end
          ].compact
        end
      }


```

The preceding code sample demonstrates how to use an input field with `control_type` set to `schema-designer`. By setting `extends_schema` to `true`, user inputs trigger a re-evaluation of the `object_definitions` block. The inputs become `config_fields` for further processing. This setup allows inputs for the `schema` field to directly influence the creation of the `data` input field.

The `schema_neutral` parameter enables you to update titles or descriptions without modifying the schema's logic. This provides increased flexibility and control when changes impact the title or description but not the schema itself. `schema_neutral` allows you to return results of an extended schema even when the input is empty.

## [#](<#arrays-of-primitive-scalar-data-types>) Arrays of primitive scalar data types

Arrays in Workato input and output schema currently only work with objects. In cases where you need to collect an array of primitive data types such as strings or integers, consider the code below. In this example, we plan to send an array of strings to a target API in the format `["column1","column2","column3"]`. This can be done by declaring an array of objects with the declaration for the `column names` input field wrapped inside the object layer.

#### [#](<#sample-code-snippet-5>) Sample code snippet
```ruby
 
    object_definitions: {
      columns: {
        fields: lambda do
          [
            {
              label: 'String Array',
              name: 'array_of_strings',
              type: "array",
              of: "string"
            }
          ]
        end
      }
    }


```

## [#](<#using-ngif-to-conditionally-hide-or-display-fields>) Using ngIf to conditionally hide or display fields

Sometimes, you need to hide or display fields based on a user's input. This could be in the `input_fields` key or the `config_fields` key. For example, if you want to showcase an additional `config_field` based on a user's input to another `config_field`. Another use case would be to showcase a new input field based on a user's input for another input field. For example, if we have an action that creates a user - if one input field is `assign_new_password`, we would use `ngIf` to conditionally show `new_password` if the user gave `true` to that input.

#### [#](<#sample-code-snippet-6>) Sample code snippet
```ruby
 
    object_definitions: {
      create_user: {
        fields: lambda do |_connection, config_fields|
          [
            {
              name: 'assign_new_password',
              label: 'Assign new password during creation',
              hint: "Select <b>yes</b> to provide a password for this newly created user. If set to <b>no</b>, an email is sent to user to define their own password.",
              control_type: 'checkbox',
              type: 'boolean',
              sticky: true,
            },
            {
              name: 'password_input',
              label: 'Custom password',
              control_type: 'password',
              ngIf: 'input.assign_new_password == "false"',
              sticky: true,
              hint: 'Required if <b>Assign new password during creation</b> is set to <b>yes</b>. ' \
                      'Provide a password of length 8 to 100 characters.'
            },
          ]
        end
      }
    }


```

## [#](<#using-convert-input-and-convert-output-for-easy-transformations>) Using `convert_input` and `convert_output` for easy transformations

In most cases, when users map fields to your action's input fields, these values are assumed to be of the data type `string` regardless of the actual `type` or `control_type` you have configured for the input field.

For example, the schema below:
```ruby
 
    [
      {
        name: "account_id",
        control_type: "integer"
        type: "int"
      }
    ]


```

When the `input` is passed to the `execute` lambda, it would still arrive in the JSON object as
```ruby
 
    {
      "account_id": "123"
    }


```

In these cases, you can use `convert_input` to transform the input into its expected data type even before it's passed to the `execute` lambda.

For example:
```ruby
 
    [
      {
        name: "account_id",
        control_type: "integer"
        type: "int",
        convert_input: "integer_conversion"
      }
    ]


```

With `convert_input` defined, the `input` argument passed to your `execute` lambda is:
```ruby
 
    {
      "account_id": 123
    }


```

This allows you to configure the expected data formats when defining the schema and allows you to skip any unnecessary code in your `execute` for ensuring data is in the correct format. The same behavior is also seen in reverse when you use `convert_output`, where a value from the output of your `execute` lambda is transformed when its mapped to a output field which contains a `convert_output` attribute.

### [#](<#predefined-convert-input-values>) Predefined `convert_input` values

  * `integer_conversion`

  * Converts input into data type integer

  * `float_conversion`

  * Converts input into data type float

  * `date_conversion`

  * Converts input into data type date

  * `render_iso8601_timestamp`

  * Converts input into date string that conforms to ISO8601 standards

  * `boolean_conversion`

  * Converts input into data type boolean

### [#](<#predefined-convert-output-values>) Predefined `convert_output` values

  * `integer_conversion`

  * Converts output into data type integer/number

  * `float_conversion`

  * Converts output into data type float

  * `date_conversion`

  * Converts output into data type date

  * `date_time_conversion`

  * Converts output into a format that matches JavaScript's Date object's `toJSON` method

  * `boolean_conversion`

  * Converts output into data type boolean

TIP

Sometimes the above transformations may not suite your needs. For example, when you need transformations to a specific time format or if you want to manipulate the structure of your data. In these cases, you can create your own custom `convert_input` and `convert_output` functions. Continue reading to learn how to do this.

## [#](<#advanced-transformations-using-methods-in-convert-input-and-convert-output>) Advanced transformations using methods in `convert_input` and `convert_output`

In some situations, APIs require you to send data in a specific format. For example, an API can require date times in `epoch` time. In many cases, we cannot assume that users in the recipe editor are comfortable with `epoch` time or that the upstream systems they are mapping data from provide date times in `epoch` format. In cases like these, we would use methods in conjunction with `convert_input` to cast their inputs to the proper format.

For example:
```ruby
 
    [
      {
        name: 'invoice_date',
        control_type: "date_time",
        convert_input: "epoch_time_conversion"
      }
    ]


```

and a matching method named `epoch_time_conversion`:
```ruby
 
    methods: {
      epoch_time_conversion: lambda do |val|
        val.to_time.to_i
      end
    }


```

which would render inputs such as `"2021-10-27T00:00:00-07:00"` to `1635318000`.

You can also use custom lambdas to perform custom transformations on nested structures. For example, when an API requires you to send a payload in the format:
```ruby
 
    {
      "data": {
        "name": {
          "value": "abc123"
        },
        "address": {
          "value": "def456"
        }
      }
    }


```

The corresponding input_field representation might be overly nested, making it cumbersome for users.

![Nested fields](/assets/img/before_custom_lambda.99a76b0d.png) _Input fields represented by the earlier example_

Custom lambdas help you improve the UX of your connector by allowing you to present a relatively flat input field structure and performing the transformations afterwards.

For example:
```ruby
 
    [
      {
        name: 'data',
        type: 'object',
        properties: [
          { 
            name: "name" 
          },
          { 
            name: "address"
          }
        ],
        convert_input: "key_value_conversion"
      }
    ]


```

and a matching method named `key_value_conversion`:
```ruby
 
    methods: {
      key_value_conversion: lambda do |val|
        # val in this case is the entire "data" object
        val.map do |key, value|
          {
            key => {
              "value" => value
            }
          }
        end.inject(:merge)
      end
    }


```

Resultant JSON:
```ruby
 
    {
      "data": {
        "name": {
          "value": "abc123"
        },
        "address": {
          "value": "def456"
        }
      }
    }


```

![Flattened fields](/assets/img/after_custom_lambda.847aa4c1.png) _Input fields that produce the same output due to custom lambdas_

Furthermore, you can call `convert_input` and `convert_output` on schema of type `arrays`. This allows you to perform transformations on the entire array of inputs.

For example:
```ruby
 
    [
      {
        name: 'products',
        type: 'array',
        of: 'object',
        convert_input: "product_conversion",
        properties: [
          {
            name: "name"
          },
          {
            name: "qty"
          }
        ]
      }
    ]


```

and a matching method named `string_concat_conversion`:
```ruby
 
    methods: {
      product_conversion: lambda do |val|
        # Render_input is called on each index of the array THEN the whole array
        if val.is_a?(Array)
          val
        else
          {
            val['name'] => val['qty']
          }
        end
      end,
    }


```

The user's input would look something like this:
```ruby
 
    {
      "products": [
        {
          "name": "car",
          "qty": "100"  
        },
        {
          "name": "wrench",
          "qty": "10"  
        }
      ]
    }


```

Resultant JSON:
```ruby
 
    {
      "products": [
        "car": "100" 
        "wrench": "10"
      ]
    }


```

```

### references/sdk-reference__object_definitions.md

```markdown
# Workato SDK Documentation

> **Source**: https://docs.workato.com/en/developing-connectors/sdk/sdk-reference/object_definitions.html
> **Fetched**: 2026-01-18T02:50:31.493402

---

# [#](<#sdk-reference-object-definitions>) SDK Reference - `object_definitions`

Object definitions represent specific resources from a target application. For example, they represent the schema for Salesforce leads or Snowflake rows.

These definitions are stored as arrays of hashes, and are used in both input and output fields.

Avoid repeating code with object definitions

Store object definition in one place and reuse throughout the custom connector.

## [#](<#structure>) Structure
```ruby
 
        object_definitions: {

          [Unique_object_definition_name]: {
            fields: lambda do |connection, config_fields, object_definitions|
              Array
            end
          },

          [Another_unique_object_definition_name]: {
            ...
          }
        },


```

* * *

Attribute | Description  
---|---  
Key | `fields`  
Type | lambda function  
Required | True  
Description | This lambda function is invoked whenever its parent object_definition's key is called in an action or trigger. It is able to make HTTP requests to dynamically build schema from metadata endpoints. The output of this lambda function should be an array of hashes that represents the input or output fields. This is called Workato Schema. Find out more [here](</developing-connectors/sdk/sdk-reference/schema.html>)  
Possible Arguments | `connection` \- Hash representing user given inputs defined in the connection.   
`config_fields` \- Hash representing the user given inputs from config fields in the action or trigger that referenced this object definition.   
`object_definitions` \- Allows you to reference other object_definitions.  
Expected Output | Array  

DEFINE ARGUMENTS FOR OBJECT DEFINITIONS

You must define arguments for your object definitions, even if they are not used. Workato determines whether your schema is static or dynamic based on whether your object definitions have arguments defined. Changing your schema from static to dynamic is considered backward incompatible; you must stop running recipes and refresh the schema for the changes to take effect.

**Static object definition**
```ruby
 
    lead: {
      fields: lambda do 
        [
          { name: "name", type: :boolean },
          { name: "email" },
          { name: "number"}
        ]
      end
    }


```

**Dynamic object definition**
```ruby
 
    lead: {
      fields: lambda do |connection, config_fields, object_definitions|
        [
          { name: "name", type: :boolean },
          { name: "email" },
          { name: "number"}
        ]
      end
    }


```

_Workato recommends that you define all object_definitions dynamically (with arguments) to ensure no issues arise from any future changes._

Example - fields

Object_definitions can be static and simply store an array. When this object definition is referenced, the `fields` lambda function returns this array.
```ruby
 
        object_definitions: {
          lead: {
            fields: lambda do |connection, config_fields, object_definitions|
              [
                { name: "name", type: :boolean },
                { name: "email" },
                { name: "number"}
              ]
            end
          }
        }


```

Object_definitions can also be dynamic and make HTTP requests to metadata endpoints. When this object definition is referenced, the `fields` lambda function makes this request, receives the response and should massage the response into the same array that can be returned to the `input_fields` or `output_fields` lambda function that referenced it. Find out more about defining these `input_fields` and `output_fields` (called Workato schema) [here](</developing-connectors/sdk/sdk-reference/schema.html>)
```ruby
 
        object_definitions: {
          form: {
            fields: lambda do |connection|
              get("https://api.unbounce.com/pages/#{connection['page_id']}/form_fields")["formFields"].
                map { |field| { name: field["id"] } }
            end
          }
        }


```

Example - Building schema from multiple object_definitions

To keep your code DRY, our recommendation is to logically break up your schema definitions into separate object_definitions. These object_definitions may be dynamically generated separately and pieced together.
```ruby
 
        object_definitions: {
          create_object_output: {
            fields: lambda do |connection, config_fields, object_definitions|
              if config_fields['object'] == 'customer'
                [
                  {
                    name: 'customer',
                    type: 'object',
                    properties: object_definitions['customer_schema']
                  },
                  {
                    name: 'card',
                    type: 'object',
                    properties: object_definitions['card_schema']
                  }
                ]
              elsif config_fields['object'] == 'subscription'
                [
                  {
                    name: 'customer',
                    type: 'object',
                    properties: object_definitions['customer_schema']
                  },
                  {
                    name: 'subscription',
                    type: 'object',
                    properties: object_definitions['subscription_schema']
                  },
                  {
                    name: 'card',
                    type: 'object',
                    properties: object_definitions['card_schema']
                  }
                ]
              end
            end
          }
        }


```

```

### references/sdk-reference__methods.md

```markdown
# Workato SDK Documentation

> **Source**: https://docs.workato.com/en/developing-connectors/sdk/sdk-reference/methods.html
> **Fetched**: 2026-01-18T02:50:30.415584

---

# [#](<#sdk-reference-methods>) SDK Reference - `methods`

Reusable methods are supported in Workato. Reusable methods help keep your custom adapter code DRY and may be used in any lambda function in your connector.

Quick Overview

Reusable methods are the same as custom functions that can be called in any portion of the code. Use them to keep your code concise and maintainable.

## [#](<#structure>) Structure
```ruby
 
        methods: {

          [Unique_method_name]: lambda do |[unique_argument_name]|
            Array, Hash, String, Int, Boolean
          end,

          [Another_unique_method_name]: lambda do |[unique_argument_name], [another_unique_argument_name]|
            Array, Hash, String, Int, Boolean
          end
        },


```

* * *

Attribute | Description  
---|---  
Key | `[Unique_method_name]`  
Type | lambda function  
Required | True  
Description | This lambda function can be invoked anywhere in the connector code such as actions, triggers, object_definitions, or even other methods. This is done by the using the special syntax `call('unique_method_name', input)`  
Possible Arguments | Arguments can be defined by you. There can be any number of arguments. Splat operators are not allowed.  
Expected Output | Variable  
Example - methods: - Using a reusable method

Use the `call()` method to reference a method. This method takes in two parameters:

  1. The method name - You can use either "method_name" (string) or :method_name (symbol) representations.
  2. Input fields - This is mapped to the arguments defined in the method definition.

Here we have the definition of a recursive method which returns the factorial of a number.
```ruby
 
        methods: {
          factorial: lambda do |input|
            number = input['number']
            if number > 1
              number * call('factorial', { number: number - 1 })
            else
              number
            end
          end
        }


```
```ruby

        actions: {
          factorial: {
            input_fields: lambda do
              [
                { name: "number", type: :integer }
              ]
            end,

            execute: lambda do |connection, input|
              { factorial: call(:factorial, { number: input['number'] }) }
            end
        },


```

```

### references/sdk-reference__picklists.md

```markdown
# Workato SDK Documentation

> **Source**: https://docs.workato.com/en/developing-connectors/sdk/sdk-reference/picklists.html
> **Fetched**: 2026-01-18T02:50:32.686527

---

# [#](<#sdk-reference-pick-lists>) SDK Reference - `pick_lists`

Picklists are used in conjunction with some input fields to enumerate the possible options in a drop-down. Picklist options can be stored in the `pick_lists` key or defined directly in the input field hash. Input fields that use `pick_list` attribute have to be of the following `control_type`:

  * `select`
    * Allows the user to select a single input from the drop-down.
  * `multiselect`
    * Allows the user to select multiple inputs from the drop-down.
  * `tree`
    * Allows the user to select a single or multiple inputs from a hierarchical drop-down.

Quick Overview

Pick lists are a great way to make your connector easier to use when the API only accepts a certain set of values. Rather than having the user type it in manually, you should use picklists so they can easily select the value from a drop-down. The `pick_list` key is where you can store these options and refer to them when building your input fields.

## [#](<#structure>) Structure
```ruby
 
        pick_lists: {

          [Unique_pick_list_name]: lambda do |connection, pick_list_parameters|
            Array
          end,

          [Another_unique_pick_list_name]: lambda do |connection, pick_list_parameters|
            Array
          end
        },


```

* * *

Attribute | Description  
---|---  
Key | `[Unique_pick_list_name]`  
Type | lambda function  
Required | True  
Description | This lambda function is invoked whenever its parent object_definition's key is called in an action or trigger. It is able to make HTTP requests to dynamically build schema from metadata endpoints. The output of this lambda function should be an array of hashes that represents the input or output fields.  
Possible Arguments | `connection` \- Hash representing user given inputs defined in `connection`   
`pick_list_parameters` \- Used when defining dependent picklists.  
Expected Output | Array of Array  

Pick_lists outputs should be a 2D array in the following format:
```ruby
 
    [
      [ "Picklist Label", "Value" ],
      [ "Picklist Label", "Value" ],
      [ "Picklist Label", "Value" ],
      [ "Picklist Label", "Value" ]
    ]


```

\- pick_lists not allowed for connections fields

Example - options in connection fields

When defining enumerable values for connection fields, take note that you may not reference `pick_lists` defined in your connector.

Instead, you may define these fields statically and using the schema attribute - `options`
```ruby
 
    connection: {
      fields: [
        {
          name: 'environment',
          label: 'Instance environment',
          control_type: 'select',
          options: [
            ['Production', 'production'],
            ['Sandbox', 'Sandbox']
          ]
        }
      ]
    }


```

Example - pick_lists: - Static

Pick_lists can be static. When referenced, this definition would return the array stored in it. When an input field references this picklist, this array is returned and rendered on the front end as a drop-down.

![](/assets/img/static_picklist.5f9188f3.png)
```ruby
 
        input_fields: lambda do |object_definitions|
          [
            {
              name: 'event_category',
              control_type: 'select',
              pick_list: 'events'
            }
          ]
        end,


```
```ruby

        pick_lists: {
          events: lambda do |connection|
            [
              ["Meeting","meeting"],
              ["Webinar","webinar"],
              ["Cloud recording","recording"],
              ["User","user"],
            ]
          end
        },


```

Example - pick_lists: - dependent & static

Dependent pick lists allow you to change the contents of a pick list based on the value of another field. For example, rather than displaying all the cities in a single pick list, we can selectively display only cities from a country, selected in another field.

![](/assets/img/dependent_picklist.58a1fa9b.gif)
```ruby
 
        input_fields: lambda do |_object_definitions|
          [
            {
              name: 'country',
              control_type: 'select',
              pick_list: 'countries',
              optional: false
            },
            {
              name: 'city',
              control_type: 'select',
              pick_list: 'cities',
              pick_list_params: { country: 'country' },
              optional: false
            }
          ]
        end


```
```ruby

        pick_lists: {
          countries: lambda do |_connection|
          [
            ['United States', 'USA'],
            ['India', 'IND']
          ]
          end,

          cities: lambda do |_connection, country:|
          {
            'USA' => [
              ['New York City', 'NYC'],
              ['San Fransisco', 'SF']
            ],
            'IND' => [
              ['Bangalore', 'BNG'],
              ['Delhi', 'DLH']
            ]
          }[country]
          end
        }


```

Example - pick_lists: - dependent & dynamic

In this example, accounts is an independent dynamic pick list while properties is a dependent dynamic pick list. When defining dynamic picklists, the response from the HTTP request should still be transformed into the same array of arrays.

In this example, we used the `.pluck` function to do the transformation.

![](/assets/img/dynamic_dependent_picklist.cc817402.gif)
```ruby
 
        input_fields: lambda do |_object_definitions|
          [
            {
              name: 'scope_id',
              label: 'Team',
              optional: false,
              control_type: 'select',
              pick_list: 'tenant_licenses'
            },
            {
              name: 'platform_id',
              control_type: 'select',
              pick_list: 'platforms',
              label: 'Platform',
              pick_list_params: { scope_ids: 'scope_id' },
              hint: 'Platform is required for creating Content'
            }
          ]
        end


```
```ruby

        pick_lists: {
          tenant_licenses: lambda do |connection|
            app_id = get("api/v5/client/client:#{connection['client_id']}")&.
                       dig('data', 'app_id')
            tenant_id = get("/api/v5/app/#{app_id}")&.dig('data', 'tenant_id')
            get('/api/v5/license/').
              params(tenant_id: tenant_id,
                     statuses: 'active')['data']&.
              select { |lic| lic['parent_id'].present? }&.
              pluck('name', 'id')
          end,

          platforms: lambda do |_connection, scope_ids:|
            get('/api/v5/platform/').
              params(scope_ids: scope_ids)['data']&.
              pluck('name', 'id')
          end,
        }


```

Example - pick_lists: - tree

Workato also allows for `tree` type picklists. Tree picklists are often used to model hierarchical structures in applications such as file/folder structures. When using tree picklists, traditional `pick_list_parameters` are ignored and replaced by a double splat variable.

To best explain this, we will use the concept of a file and folder structure, where folders might contain additional folders or files. All folders and files are considered nodes, while the main distinction is that folders might have child nodes whereas files may not. When you define a tree picklist, each time the user clicks on a folder node, the picklist is re-evaluated to build out the child nodes within it. The value of the folder node that the user clicked on can be found by `args&.[](:__parent_id)`. If this value is nil, this indicates that we are at the root node.
```ruby
 
        input_fields: lambda do |_object_definitions|
          [
            {
              name: 'path',
              label: 'File path',
              optional: false,
              control_type: 'tree',
              pick_list: "file_path"
            },
          ]
        end


```
```ruby

        pick_lists: {
          file_path: lambda do |_connection, **args|
            # Get sub folders
            if (folder_path = args&.[](:__parent_id)).presence
              path = []
              response = get("/pubapi/v1/fs#{folder_path}").params(list_content: true, sort_by: 'name')
              if response['is_folder']
                path << response['folders']&.map { |folder| [folder['name'].labelize, folder['path'].gsub(' ', '%20'), nil, true] }
                path << response['files']&.map { |file| [file['name'].labelize, file['path'].gsub(' ', '%20'), nil, false] } if response['files'].present?
                Array.wrap(path.compact).flatten(1)
              end
            else
              # Get root folders
              get('/pubapi/v1/fs/')['folders']&.map do |folder|
                [folder['name'].labelize, folder['path'].gsub(' ', '%20'), nil, true]
              end
            end
          end,
        }


```

![](/assets/img/tree-file-only.a2e08ad6.gif)

In the above case, we have wanted to only allow users to select files to be downloaded. However, in a variety of cases, you might want to allow users to also select folders (the nodes) as you want them to provide a path to a folder instead of a file. This can be configured like below:
```ruby
 
        input_fields: lambda do |_object_definitions|
          [
            {
              name: 'path',
              label: 'Folder path',
              optional: false,
              control_type: 'tree',
              pick_list: 'folder_path',
              tree_options: {
                selectable_folder: true
              }
            },
          ]
        end


```

Another variation is when you need to allow end users to select multiple folders. This can be configured like below:
```ruby
 
        input_fields: lambda do |_object_definitions|
          [
            {
              name: 'path',
              label: 'Folder path',
              optional: false,
              control_type: 'tree',
              pick_list: 'folder_path',
              tree_options: {
                selectable_folder: true,
                multi_select: true,
                force_selection_hierarchy: true # Setting this to true causes all child nodes to be selected when the parent is selected.
              }
            },
          ]
        end


```

```

### references/sdk-reference__http.md

```markdown
# Workato SDK Documentation

> **Source**: https://docs.workato.com/en/developing-connectors/sdk/sdk-reference/http.html
> **Fetched**: 2026-01-18T02:50:29.243202

---

# [#](<#http-methods>) HTTP Methods  

In this section we cover the various HTTP methods that Workato supports. You should already be familiar with most of them. We also cover how you can do post-response processing of your HTTP calls to manipulate data into formats that are easier to use later on in your connector code.

## [#](<#http-verb-methods>) HTTP verb methods

HTTP verb | Method | Example  
---|---|---  
GET | `get()` | `get("url", parameters)`  
POST | `post()` | `post("url", payload)`  
PUT | `put()` | `put("url", payload)`  
PATCH | `patch()` | `patch("url", payload)`  
DELETE | `delete()` | `delete("url", parameters)`  
OPTIONS | `options()` | `options("url", parameters)`  

## [#](<#forming-a-request>) Forming a request

Each HTTP verb method must be provided a `url` string as the first argument. The second argument (optional) can be in 2 forms.

Firstly, `input` can be passed as a single hash. This hash can simply be the `input` argument of the `execute` or `poll` argument, such as the following:
```ruby
 
    execute: lambda do |connection, input|
      get("https://www.some_api_endpoint.com/api", input)
    end


```

The hash can also be formed before like this:
```ruby
 
    execute: lambda do |connection, input|
      params = {
        "id" => input["id"]
      }

      get("https://www.some_api_endpoint.com/api", params)
    end


```

The Workato SDK framework processes this hash value and transforms it into the respective data format. For GET, DELETE OPTIONS requests, the hash data is converted to URL query parameters.

For POST, PUT, and PATCH, the payload is formed into the request body into a format that you specify. Learn how to work with the various data formats [here](</developing-connectors/sdk/guides/data-formats.html>).

The other method of passing request data is as a series of key/value pairs.
```ruby
 
    execute: lambda do |connection, input|
      post("https://www.some_api_endpoint.com/api", name: input["name"], email: input["email"])
    end


```

All arguments after the first will be transformed into request data. In this case, since the default data format is JSON, the following request body is formed:
```ruby
 
    {
      "name": "Ee Shan",
      "email": "[[email protected]](</cdn-cgi/l/email-protection>)"
    }


```

For a GET request, the following URL parameters are formed.
```ruby
 
    execute: lambda do |connection, input|
      get("https://www.some_api_endpoint.com/api", name: input["name"], email: input["email"])
    end


```

The full request URL string will be:
```ruby
 
    https://www.some_api_endpoint.com/api?name%3DEe%20Shan%26email%3Deeshan%40workato.com


```

AUTHENTICATION APPENDS TO THE REQUEST URL

Any authentication you define is appended to the request URL. The preceding example assumes no authentication is required. Authentication is applied through the `apply` block defined in the `connection` object.

## [#](<#additional-helper-methods-to-form-requests>) Additional helper methods to form requests

You may use a variety of other helper methods on Workato by chaining them after the initial HTTP verb method. Here are some methods that might be useful:

### [#](<#payload>) payload

This method allows you to add a payload to a request and follows the same syntax that we covered above.
```ruby
 
    execute: lambda do |connection, input|
      post("https://www.some_api_endpoint.com/api")
        .payload(name: input["name"], email: input["email"])
    end


```

Resulting the payload of the post request:
```ruby
 
    {
      "name": "Ee Shan",
      "email": "[[email protected]](</cdn-cgi/l/email-protection>)"
    }


```

## [#](<#params>) params

This method allows you to add a query parameters to a request and follows the same syntax that we covered above. These values will be URL-encoded.
```ruby
 
    execute: lambda do |connection, input|
      get("https://www.some_api_endpoint.com/api")
        .params(name: input["name"], email: input["email"])
    end


```
```ruby

    https://www.some_api_endpoint.com/api?name%3DEe%20Shan%26email%3Deeshan%40workato.com


```

## [#](<#headers>) headers

This method allows you to add a headers to a request and follows the same syntax that we covered above. Headers defined here **are not case sensitive.**
```ruby
 
    execute: lambda do |connection, input|
      get("https://www.some_api_endpoint.com/api")
        .headers(Authorization: "Bearer HTB674HJK1")
    end


```

TIP

Whilst case sensitive headers are a departure from [RFC (opens new window)](<http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2>), you may use them in your HTTP methods through the method `case_sensitive_headers` in place of `headers`.

## [#](<#tls-client-cert>) tls_client_cert

This method allows you to add SSL certs, keys, passphrases, and intermediates certs.
```ruby
 
    execute: lambda do |connection, input|
      get("https://www.some_api_endpoint.com/api")
        .tls_client_cert(
          certificate: connection['ssl_client_cert'],
          key: connection['ssl_client_key'],
          passphrase: connection['ssl_key_passphrase'],
          intermediates: connection['ssl_client_intermediate_cert']
        )
    end


```

## [#](<#post-response-processing>) Post-response processing

### [#](<#default-response-data>) Default response data

By default, all HTTP verb methods will return the response body of the request. For example, the following request creates a user in **Okta**.
```ruby
 
    execute: lambda do |connection, input|
      response = post("/api/v1/users", profile: { login: input["email"], displayName: input["name"] })
    end


```

`response` variable will a hash that looks like this:
```ruby
 
    {
      "id": "00ub0oNGTSWTBKOLGLNR",
      "status": "STAGED",
      "created": "2018-03-13T21:36:25.344Z",
      "activated": null,
      "statusChanged": null,
      "lastLogin": null,
      "lastUpdated": "22018-03-13T21:36:25.344Z",
      "passwordChanged": null,
      "profile": {
        "firstName": "Ee Shan",
        "lastName": "Sim",
        "email": "[[email protected]](</cdn-cgi/l/email-protection>)",
        "login": "[[email protected]](</cdn-cgi/l/email-protection>)",
        "mobilePhone": null
      },
      "credentials": {
        "provider": {
          "type": "OKTA",
          "name": "OKTA"
        }
      }
    }


```

### [#](<#response-handling>) Response handling

`after_response` is an optional block that can be chained to the HTTP verb methods to handle the various parts of a HTTP response. Let's take a look at an example, again using the **Okta** API.

When a request is sent to the [List all users (opens new window)](<https://developer.okta.com/docs/api/resources/users#list-all-users>) endpoint, the truncated response looks like this.
```ruby
 
    HTTP/1.1 200 OK
    Content-Type: application/json
    Link: <https://workatotest.okta.com/api/v1/users?limit=200>; rel="self"

    [
      {
        "id": "00utti9t3j1xO9jOm2p6",
        "status": "ACTIVE",
        "created": "2018-03-15T08:23:05.000Z",
        "activated": null,
        "statusChanged": "2018-03-15T08:39:39.000Z",
        "lastLogin": "2018-03-15T08:39:40.000Z",
        "lastUpdated": "2018-03-15T08:39:40.000Z",
        "passwordChanged": "2018-03-15T08:39:39.000Z",
        "profile": {},
        "credentials": {},
        "_links": {}
      }
    ]


```

This response can be broken down into 3 parts. The HTTP response **code** , **header** , and **body**.

`after_response` can be used to handle all these parts of the HTTP response. Suppose I have an action that lists all users and outputs the entire response, including the link to the existing page from the header.
```ruby
 
    execute: lambda do |connection, input|
      get("/api/v1/users").after_response do |code, body, headers|
        {
          code: code,
          next_link: headers["link"],
          users: body
        }
      end
    end


```

The resultant output of this action will contain all 3 parts of the response.
```ruby
 
    {
      "code": 200,
      "next_link": "<https://workatotest.okta.com/api/v1/users?limit=200>; rel=\"self\"",
      "users": [
        {
          "id": "00utti9t3j1xO9jOm2p6",
          "status": "ACTIVE",
          "created": "2018-03-15T08:23:05.000Z",
          "activated": null,
          "statusChanged": "2018-03-15T08:39:39.000Z",
          "lastLogin": "2018-03-15T08:39:40.000Z",
          "lastUpdated": "2018-03-15T08:39:40.000Z",
          "passwordChanged": "2018-03-15T08:39:39.000Z",
          "profile": {},
          "credentials": {},
          "_links": {}
        }
      ]
    }


```

### [#](<#testing>) Testing

You can easily verify this while developing your custom connector. When you include post-request handling, the output tab should reflect the expected JSON object.

![Output with response code and header values](/assets/img/response_with_headers.8ce095a2.png) _Output with response code and header values_

```

### references/sdk-reference__ruby_methods.md

```markdown
# Workato SDK Documentation

> **Source**: https://docs.workato.com/en/developing-connectors/sdk/sdk-reference/ruby_methods.html
> **Fetched**: 2026-01-18T02:50:34.125656

---

# [#](<#available-ruby-methods>) Available Ruby methods

Workato implements a subset of Ruby's public instance methods within its SDK framework. This document lists the Ruby methods that are available when building your connectors. You can request to add additional methods to this list using the [Workato feedback widget (opens new window)](<https://ideas.workato.com/app/#/login>).

WHITELIST REMOVAL

Workato has removed whitelisting for its SDK framework, starting March 2025. This means that developers can now access the full functionality of Ruby 2.7, including built-in libraries, and any available Ruby gems in the SDK container. This change significantly expands the range of capabilities SDK developers can leverage within the platform.

[Learn more](</developing-connectors/sdk/sdk-reference/whitelist-removal.html>) about the capabilities available with the removal of ruby whitelisting.

This enhancement doesn't apply to the Ruby code connector.

PERSONAL REUSABLE METHODS

You can declare personal reusable methods to use in any block when using Workato SDK.

* * *

## [#](<#at>) at

Creates a new time object with the given argument.

See [at (opens new window)](<https://apidock.com/ruby/Time/at/class>) method definition.

* * *

## [#](<#abs>) abs

Returns the absolute value of a number.

* * *

## [#](<#account-property>) account_property

Returns the value for a specific account property in the user's workspace.
```ruby
 
    client_secret = account_property('hubspot_webhook_client_secret')


```

Note that you can only invoke this method from the following lambdas within the `connection` hash:

  * `authorization_url`
  * `token_url`
  * `acquire`
  * `base_uri`

Also, other lambdas within `actions`, `triggers`, `methods`, `object_definitions`, and `pick_lists`.

* * *

## [#](<#aes-cbc-encrypt>) aes_cbc_encrypt

AES encryption with CBC mode. Accepts 128, 192, and 256-bit keys.
```ruby
 
    key128 = workato.pbkdf2_hmac_sha1("password", workato.random_bytes(8))
    workato.aes_cbc_encrypt("text_to_encrypt", key128)


```

* * *

## [#](<#aes-cbc-decrypt>) aes_cbc_decrypt

AES decryption with CBC mode. Accepts 128, 192, and 256-bit keys.
```ruby
 
    workato.aes_cbc_decrypt("text_to_decrypt", key128)


```

* * *

## [#](<#aes-gcm-encrypt>) aes_gcm_encrypt

Returns an AES encrypted string and auth tag using GCM mode. The initialization vector (IV) key size must be 12 bytes. Accepts 128, 192, and 256-bit keys.
```bash
 
    # Generate a salt for key derivation
    salt = workato.random_bytes(8)

    # Derive a key using PBKDF2 with HMAC-SHA1
    key128 = workato.pbkdf2_hmac_sha1("password", salt)

    # Initialize an IV (initialization vector)
    iv = "init_vector0"

    # Encrypt the text
    encrypted_data = workato.aes_gcm_encrypt("text_to_encrypt", key128, iv)  # [0x3040ffe9e51d4a929605fe0a262eea, 0x0f7e0a05eb25512c03ffafca43418a12]


```

You can also provide `auth_data`, which accepts a string value:
```ruby
 
    auth_data = "my_auth_data"

    # Generate a salt for key derivation
    salt = workato.random_bytes(8)

    # Derive a key using PBKDF2 with HMAC-SHA1
    key128 = workato.pbkdf2_hmac_sha1("password", salt)

    # Initialize an IV (initialization vector)
    iv = "init_vector0"

    # Encrypt the text
    encrypted_data = workato.aes_gcm_encrypt("text_to_encrypt", key128, iv, auth_data)  # [0x3040ffe9e51d4a929605fe0a262eea, 0x0f7e0a05eb25512c03ffafca43418a12]


```

The result is an array in the form `[encrypted_string, auth_tag]`. Use the [`.first`](<#first>) and [`.last`](<#last>) formulas to retrieve these values individually.

* * *

## [#](<#aes-gcm-decrypt>) aes_gcm_decrypt

Returns an AES decrypted string using GCM mode. The initialization vector (IV) key size must be 12 bytes. Accepts 128, 192, and 256-bit keys.
```ruby
 
    decrypted_string = workato.aes_gcm_decrypt(encrypted_string, key128, auth_tag, iv)  # 0x746578745f746f5f656e6372797074


```

If you encrypted with `auth_data`, you must include it in the formula:
```ruby
 
    decrypted_string = workato.aes_gcm_decrypt(encrypted_string, key128, auth_tag, iv, auth_data)  # 0x746578745f746f5f656e6372797074


```

The output is a raw byte sequence in hexadecimal format. You can append the [`.as_utf8`](<#as_utf8>) formula to decode it into a UTF-8 string:
```ruby
 
    decrypted_string =  workato.aes_gcm_decrypt(encrypted_string, key128, auth_tag, iv, auth_data).as_utf8  # "text_to_encrypt"


```

* * *

## [#](<#after-error-response>) after_error_response

Can be chained with an HTTP request to rescue a failed request. See [Error handling](</developing-connectors/sdk/guides/error-handling.html>).

* * *

## [#](<#after-response>) after_response

Can be chained with an HTTP request to utilize the response's headers, and so on. See [Error handling](</developing-connectors/sdk/guides/error-handling.html>).

* * *

## [#](<#ago>) ago

Go back in time. Returns timestamp.
```ruby
 
    2.days.ago #2017-01-15T12:30:00.000000-07:00 if time now is 2017-01-17T12:30:00.000000-07:00
    30.minutes.ago #2017-01-15T12:30:00.000000-07:00 if time now is 2017-01-15T13:00:00.000000-07:00
    30.seconds.ago #2017-01-15T12:30:00.000000-07:00 if time now is 2017-01-15T12:30:30.000000-07:00


```

See [ago (opens new window)](<https://apidock.com/rails/ActiveSupport/Duration/ago>) method definition.

* * *

## [#](<#all>) all?

Passes each element of the collection to the given block. The method returns true if the block never returns false or nil.
```ruby
 
    %w[ant bear cat].all? { |word| word.length >= 3 } #=> true


```

See [all?](<hhttps://apidock.com/ruby/Enumerable/all%3F>) method definition.

* * *

## [#](<#as-string>) as_string

Decode byte sequence as a string in the given encoding.
```ruby
 
    "0J/RgNC40LLQtdGC\n".decode_base64.as_string('utf-8')


```

* * *

## [#](<#as-utf8>) as_utf8

Decode byte sequence as a UTF-8 string.
```ruby
 
    "0J/RgNC40LLQtdGC\n".decode_base64.as_utf8


```

* * *

## [#](<#aws-generate-signature>) aws.generate_signature

Generates an AWS V4 Signature for AWS services and returns a hash that contains the URL and signature for you to formulate the request.
```ruby
 
    aws.generate_signature(
       connection: connection,
       service: "s3",
       region: connection["aws_region"],
       host: "s3.dualstack.#{connection['aws_region']}.amazonaws.com",
       method: "GET",
       path: "/demo",
       params: {
         "list-type": 2,
         "max-keys": 1000
       }.compact,
       headers: {
         Test: "hello!"
       },
       payload: {
         hello: "world"
       }.to_json
     )


```

See [AWS authentication](</developing-connectors/sdk/guides/authentication/aws_auth.html>).

* * *

## [#](<#blank>) blank?

Returns true if value is null or an empty string, otherwise false.

* * *

## [#](<#binary>) binary?

Returns true if value is a binary array.

* * *

## [#](<#beginning-of-hour>) beginning_of_hour

Returns timestamp for top-of-the-hour for given timestamp.
```ruby
 
    "2017-06-01T16:56:00.000000-07:00".to_time.beginning_of_hour #2017-06-01T16:00:00.000000 +0000


```

* * *

## [#](<#beginning-of-day>) beginning_of_day

Returns timestamp for midnight for given timestamp.
```ruby
 
    "2017-06-08T22:30:10.000000-07:00".to_time.beginning_of_day #2017-06-08T00:00:00.000000 +0000


```

* * *

## [#](<#beginning-of-week>) beginning_of_week

Returns timestamp for midnight at the start of the week (Mon) for the given timestamp.
```ruby
 
    "2017-08-18T00:00:00.000000-07:00".to_time.beginning_of_week #2017-08-14T00:00:00.000000 +0000


```

* * *

## [#](<#beginning-of-month>) beginning_of_month

Returns timestamp for midnight for the start of the month for the given timestamp.
```ruby
 
    "2017-01-30T22:35:00.000000-07:00".to_time.beginning_of_month #2017-01-01T00:00:00.000000 +0000


```

* * *

## [#](<#beginning-of-year>) beginning_of_year

Returns timestamp for midnight for the start of the year for a given timestamp.
```ruby
 
    "2017-01-30T22:35:00.000000 -07:00".to_time.beginning_of_year #2017-01-01T00:00:00.000000 +0000


```

* * *

## [#](<#bytes>) bytes

Returns an array of bytes for a given string.
```ruby
 
    "Hello".bytes # ["72","101","108","108","111"]


```

* * *

## [#](<#bytesize>) bytesize

Returns the length of a given string in bytes.
```ruby
 
    "Hello".bytesize # 5


```

* * *

## [#](<#byteslice>) byteslice

Returns a substring of specified bytes instead of length. In some cases, non-ASCII characters (for example, Japanese and Chinese characters) may use multiple bytes.
```ruby
 
    "abc漢字".byeslice(0,4) # "abc漢"


```

See [byteslice (opens new window)](<https://apidock.com/ruby/String/byteslice>) method definition.

* * *

## [#](<#capitalize>) capitalize

Capitalizes the first character of the string.

* * *

## [#](<#case-sensitive-headers>) case_sensitive_headers

Can be chained with HTTP methods to introduce headers that are case-sensitive. By default, Workato does not respect case sensitivity for headers, as per RFC specification.
```ruby
 
    get("https://www.example.com").case_sensitive_headers("HeLlo": "world")


```

* * *

## [#](<#checkpoint>) checkpoint!

Similar to `reinvoke_after`, the `checkpoint!` method is used with file stream consuming actions. When invoked, Workato checks the duration of the action's execution. If it exceeds 120 seconds, Workato refreshes the action level timeout with a slight delay to ensure fair processing.

This allows you to transfer files that exceed the current 180-second timeout limit.

* * *

## [#](<#chunk>) chunk

Enumerates over the items, chunking them together based on the return value of the block.

See [chunk (opens new window)](<https://apidock.com/ruby/Enumerable/chunk>) method definition.

* * *

## [#](<#chunk-while>) chunk_while

Creates an enumerator for each chunked element. The beginnings of chunks are defined by the block.

See [chunk_while (opens new window)](<https://apidock.com/ruby/Enumerable/chunk_while>) method definition.

* * *

## [#](<#collect>) collect

Returns a new array with the results of running block once for every element in enum.

See [collect (opens new window)](<https://apidock.com/ruby/Array/collect>) method definition.

* * *

## [#](<#collect-concat>) collect_concat

Returns a new array with the concatenated results of running block once for every element in enum.

See [collect_concat (opens new window)](<https://apidock.com/ruby/Enumerable/collect_concat>) method definition.

* * *

## [#](<#compact>) compact

Returns a hash with non nil values.

See [compact (opens new window)](<https://apidock.com/rails/Hash/compact>) method definition.

* * *

## [#](<#count>) count

Returns the number of elements in an array that match the given value.
```ruby
 
    ["apple", "orange", "apple", "banana", "apple"].count("apple")


```

For more details, refer to the [count (opens new window)](<https://apidock.com/ruby/Array/count>) method definition.

* * *

## [#](<#csv-parse>) csv.parse

Allows you to parse a CSV string into a JSON array that makes it easy to display as datapills.
```ruby
 
    workato.csv.parse("blue;1\nwhite;2\n", headers: "color;count", col_sep: ";")


```

Takes seven arguments:

  * string

  * The first position of the method which represents the CSV string to parse.

  * headers

  * Either `true` (First row of actual CSV will be used as headers), `array` of `string` (corresponding to each column header) or `string` (Artificial first row of the CSV with appropriate column separator).

  * col_sep

  * The column separator in the CSV. Defaults to `,`.

  * row_sep

  * The row separator in the CSV. Defaults to `\n`.

  * quote_char

  * The quoting character in the CSV. Defaults to double quotes `"`.

  * skip_blanks

  * Boolean that indicates whether blank lines in the string input should be ignored. Defaults to false.

  * skip_first_line

  * Boolean that indicates if we should skip the first line. Useful when `headers` is true.

**Limits:** File size must be less than 30 MB and CSV lines fewer than 65K.

* * *

## [#](<#csv-generate>) csv.generate

Allows you to generate a CSV string from a JSON array so you can send it to a downstream system as a file.
```ruby
 
    workato.csv.generate(headers: ["color", "amount"], col_sep: ";") do |csv|
      csv << [:blue, 1]
      csv << [:white, 2]
    end


```

Takes five arguments:

  * headers

  * Either `true` (First row of actual CSV will be used as headers), `array` of `string` (corresponding to each column header) or `string` (Artificial first row of the CSV with appropriate column separator).

  * col_sep

  * The column separator in the CSV. Defaults to `,`.

  * row_sep

  * The row separator in the CSV. Defaults to `\n`.

  * quote_char

  * The quoting character in the CSV. Defaults to double quotes `"`.

  * force_quotes

  * Boolean that determines whether each output field should be quoted.

Finally, one lambda that allows you to append individual rows to this CSV as an array of strings.

* * *

## [#](<#cycle>) cycle

Cycles through an array for a specified number of times and calls a block for each element.

See [cycle (opens new window)](<https://apidock.com/ruby/v2_5_5/Enumerable/cycle>) method definition.

* * *

## [#](<#decode-base64>) decode_base64

Decode using Base64 algorithm.

* * *

## [#](<#decode-hex>) decode_hex

Decode hexadecimal into binary string.

* * *

## [#](<#decode-url>) decode_url

URL decode a string. This formula uses `CGI.unescape` to URL decoding.

* * *

## [#](<#decode-urlsafe-base64>) decode_urlsafe_base64

Decode using URL-safe modification of Base64 algorithm.

* * *

## [#](<#decrypt>) decrypt

Decrypt the encrypted string using AES-256-CBC algorithm. Input should be in RNCryptor V3 format.

This method returns a byte array instead of a string. You can convert the decrypt method output to a string by appending the [`.as_string()`](<#as-string>) or [`.as_utf8`](<#as-utf8>) function to your formula.

* * *

## [#](<#deep-merge>) deep_merge

Merges a hash with another hash, including nested child hashes.

See [deep_merge (opens new window)](<https://apidock.com/rails/Hash/deep_merge>) method definition.

* * *

## [#](<#delete-at>) delete_at

Delete elements in an array.

See [delete_at (opens new window)](<https://apidock.com/ruby/Array/delete_at>) method definition.

* * *

## [#](<#detect>) detect

Passes each element in an array to a block. Returns the first element that satisfies a block.

See [detect (opens new window)](<https://apidock.com/ruby/v2_5_5/Enumerable/detect>) method definition.

* * *

## [#](<#dig>) dig

Retrieves the value object corresponding to the index passed in.

The `dig` method is often used to strip away layers in nested arrays/hashes. For example, we use the `dig` method often when dealing with XML data formats.

See [dig (opens new window)](<https://apidock.com/ruby/Array/dig>) method definition.

* * *

## [#](<#drop>) drop

Drops first N elements from an Enumerator and returns the rest of the elements in an array.
```ruby
 
    [1, 2, 3, 4, 5, 0].drop(3) #=> [4, 5, 0]


```

See [drop (opens new window)](<https://apidock.com/ruby/v2_5_5/Enumerable/drop>) method definition.

* * *

## [#](<#drop-while>) drop_while

Drops elements up to, but not including, the first element of an array for which the block returns nil or false.

See [drop_while (opens new window)](<https://apidock.com/ruby/v2_5_5/Enumerable/drop_while>) method definition.

* * *

## [#](<#dst>) dst?

Returns true if the time is within Daylight Savings Time for the specified time zone.

* * *

## [#](<#each>) each

Basic iterator.
```ruby
 
    [1, 2, 3].each { |i| puts i }


```

* * *

## [#](<#each-byte>) each_byte

Passes each byte in a given string to the given block, or returns an enumerator if no block is given.

See [each_byte (opens new window)](<https://apidock.com/ruby/v2_5_5/String/each_byte>) method definition.

* * *

## [#](<#each-char>) each_char

Passes each character in a given string to the given block. Returns an enumerator if no block is given.

See [each_char (opens new window)](<https://apidock.com/ruby/String/each_char>) method definition.

* * *

## [#](<#each-cons>) each_cons

Iterates the given block for each array of consecutive N elements. If no block is given, returns an enumerator.

See [each_cons (opens new window)](<https://apidock.com/ruby/v2_5_5/Enumerable/each_cons>) method definition.

* * *

## [#](<#each-entry>) each_entry

Iterates over an array and returns each element in the block.

See [each_entry (opens new window)](<https://apidock.com/ruby/v2_5_5/Enumerable/each_entry>) method definition.

* * *

## [#](<#each-slice>) each_slice

Iterates the given block for each slice of N elements. If no block is given, returns an enumerator.

See [each_slice (opens new window)](<https://apidock.com/ruby/v2_5_5/Enumerable/each_slice>) method definition.

* * *

## [#](<#each-with-index>) each_with_index

Iterator returned with an index.
```ruby
 
    [1, 2, 3].each_with_index { |item, index| puts "#{index}:#{item}" }


```

See [each_with_index (opens new window)](<https://apidock.com/ruby/Enumerator/each_with_index>) method definition.

* * *

## [#](<#each-with-object>) each_with_object

Iterator returned with an object which you can define.
```ruby
 
    [%w(foo bar)].each_with_object({}) { |str, hsh| hsh[str] = str.upcase }
    # => {'foo' => 'FOO', 'bar' => 'BAR'}


```

See [each_with_object (opens new window)](<https://apidock.com/rails/Enumerable/each_with_object>) method definition.

* * *

## [#](<#encode-hex>) encode_hex

Converts binary string to its hex representation.
```ruby
 
    "0J/RgNC40LLQtdGC\n".decode_base64.encode_hex


```

* * *

## [#](<#encode-sha256>) encode_sha256

Encode using SHA256 algorithm. The output is a binary string. Use `encode_hex` to convert to a hex representation.
```ruby
 
    "hello".encode_sha256 #=> 0x2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
    "hello".encode_sha256.encode_hex #=> 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824


```

* * *

## [#](<#encode-sha512>) encode_sha512

Encode using SHA512 algorithm. The output is a binary string. Use `encode_hex` to convert to a hex representation.
```ruby
 
    "hello".encode_sha512 #=> 0x9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
    "hello".encode_sha512.encode_hex #=> 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043


```

* * *

## [#](<#encode-base64>) encode_base64

Encode using Base64 algorithm.

* * *

## [#](<#encode-url>) encode_url

URL encode a string.
```ruby
 
    'Hello World'.encode_url # 'Hello%20World'


```

* * *

## [#](<#encode-urlsafe-base64>) encode_urlsafe_base64

Encode using URL-safe modification of Base64 algorithm.

* * *

## [#](<#encode-www-form>) encode_www_form

Join hash into URL-encoded string of parameters.
```ruby
 
    {"apple" => "red green", "2" => "3"}.encode_www_form #"apple=red+green&2=3"


```

* * *

## [#](<#ends-of-month>) ends_of_month

Returns a new date/time representing the end of the month.
```ruby
 
    "2017-08-18T00:00:00".to_time.end_of_month #2017-08-31 23:59:59 +0000


```

* * *

## [#](<#ends-with>) ends_with?

Returns true if string ends with a specific pattern. False otherwise.
```ruby
 
    "Hello!".ends_with?("!") #true


```

* * *

## [#](<#entries>) entries

Returns an array containing the items in enum.
```ruby
 
    (1..7).entries #=> [1, 2, 3, 4, 5, 6, 7]
    { 'a'=>1, 'b'=>2, 'c'=>3 }.entries   #=> [["a", 1], ["b", 2], ["c", 3]]


```

See [entries (opens new window)](<https://apidock.com/ruby/v2_5_5/Enumerable/entries>) method definition.

* * *

## [#](<#error>) error

Raise a job error with a user-defined error body.
```ruby
 
    error("Unable to find Account with ID: 123")


```

* * *

## [#](<#even>) even?

Returns true if integer is an even number.

See [even? (opens new window)](<https://apidock.com/ruby/Integer/even%3F>) method definition.

* * *

## [#](<#except>) except

Returns a hash that includes everything except given keys.
```ruby
 
    { name: "Jake", last_name: "Paul", age: "22" }.except(:name, :last_name) # { :age => "22" }


```

See [except (opens new window)](<https://apidock.com/rails/Hash/except>) method definition.

* * *

## [#](<#exclude>) exclude?

Returns true if field does not contain a value. Case sensitive.
```ruby
 
    "Partner account".exclude?("Partner") #false


```

See [exclude (opens new window)](<https://apidock.com/rails/String/exclude%3F>) method definition.

* * *

## [#](<#execution-context>) execution_context

RESTRICTED METHOD AVAILABILITY

This method is available only to connectors built within Embedded partner workspaces. It returns a hash containing the context of the recipe and job from which this action or trigger is invoked. If there is no applicable context, for example, the job ID when a request is sent in a trigger, the key's value is `null`.

The following table summarizes the lambdas: `execution_context` return values:

Key | recipe_id | job_id  
---|---|---  
execute | Yes | Yes  
methods (For each method called within execute) | Yes | Yes  
apply (For requests sent in the execute lambda) | Yes | Yes  
poll | Yes | No  
methods (For each method called within poll) | Yes | No  
apply (For requests sent in the poll lambda) | Yes | No  
object_definitions (For each fields method defined) | No | No  
pick_lists (For each pick_list method defined) | No | No  
methods (For each method called within pick_lists or object_definitions) | No | No  

You can reference the execution context using the `execution_context` method.
```ruby
 
    execution_context #=> { :recipe_id => "1234", :job_id => "j-ATh8ngzP-f69ak9" }
    execution_context[:recipe_id] #=> "1234"
    execution_context[:job_id] #=> "j-ATh8ngzP-f69ak9"


```

* * *

## [#](<#fetch>) fetch

Returns a value from the hash for the given key.

See [fetch (opens new window)](<https://apidock.com/ruby/Hash/fetch>) method definition.

* * *

## [#](<#find-all>) find_all

Returns an array containing all elements of a hash or array that satisfy the condition denoted in the block.
```ruby
 
    Foo = { :abc => 1, :bad => [1,2] }
    Foo.find_all { |i| i[0] == :abc } # [[:abc, 1]]


```

See [find_all (opens new window)](<https://apidock.com/ruby/Enumerable/find_all>) method definition.

* * *

## [#](<#find-index>) find_index

Compares each element in an array to a given block and returns the index for the first match.
```ruby
 
    (1..100).find_index { |i| i % 5 == 0 and i % 7 == 0 }  #=> 34


```

See [find_index (opens new window)](<https://apidock.com/ruby/v2_5_5/Enumerable/find_index>) method definition.

* * *

## [#](<#first>) first

Returns the first item in a list. Can also be used to return the first n items in a list.

See [first (opens new window)](<https://apidock.com/ruby/Array/first>) method definition.

* * *

## [#](<#flatten>) flatten

Flatten multi-dimensional array to simple array.
```ruby
 
    [[1, 2, 3],[4,5,6]].flatten #[1, 2, 3, 4, 5, 6]


```

See [flatten (opens new window)](<https://apidock.com/ruby/Array/flatten>) method definition.

* * *

## [#](<#flat-map>) flat_map

Returns a new array with the concatenated results of running block once for every element in enum.
```ruby
 
    [[1, 2], [3, 4]].flat_map { |e| e + [100] } #=> [1, 2, 100, 3, 4, 100]


```

See [flat_map (opens new window)](<https://apidock.com/ruby/v2_5_5/Enumerable/flat_map>) method definition.

* * *

## [#](<#follow-redirection>) follow_redirection

By default, we follow most 3XX redirect HTTP codes. In some cases, you may need to apply this to follow the redirect for any response code.
```ruby
 
        action_with_follow_redirection: {
          execute: lambda do |_connection, _input|
     get('https://run.mocky.io/v3/41abc094-6b10-41a9-8201-b15146258b12').follow_redirection.after_response do |code, body, headers|
       {
         code: code,
         body: body,
         headers: headers
       }
     end
          end
        }


```

* * *

## [#](<#format-json>) format_json

Convert request to JSON format and expect response body in JSON format.

* * *

## [#](<#format-map>) format_map

Creates a new array of strings by applying a format to each item in the input array.
```ruby
 
    [[{name: 'Jake', age: 23}].format_map('Name: %{name}, Age: %{age}') #['Name: Jake, Age: 23']
    [[22, 45], [33, 88]].format_map('Id: %s, Count: %s') #['Id: 22, Count: 45', 'Id: 33, Count: 88']
    ['Alex', 'Hao', 'Kai'].format_map('Name: %s') #['Name: Alex', 'Name: Hao', 'Name: Kai']


```

See [format_map](</formulas/array-list-formulas.html#formatmap>) method definition.

* * *

## [#](<#format-xml>) format_xml

Convert request to XML format and expect response body in XML format.

Takes three arguments:

  * root_element_name

  * Adds a root element tag to your outgoing XML payload.

  * namespaces

  * Adds additional tags to your payload for namespaces.

  * strip_response_namespaces

  * Strips namespaces from XML responses.

* * *

## [#](<#from-now>) from_now

Go forward in time. Returns timestamp of the moment that the formula was executed, with the specified time period added in Pacific Time (UTC-8/UTC-7).
```ruby
 
    4.months.from_now #2017-05-23T14:40:07.338328-07:00
    2.days.from_now #2017-01-05T14:40:07.338328-07:00
    30.minutes.from_now
    12.seconds.from_now


```

* * *

## [#](<#from-xml>) from_xml

Converts XML string to hash.
```ruby
 
    "<?xml version="1.0" encoding="UTF-8"?> <hash><foo type="integer"></foo></hash>".from_xml # { "hash": [ "foo": [ { "@type": "integer", "content!": "1" } ] ] }


```

* * *

## [#](<#grep>) grep

Searches through an enumerator for every element that satisfies your condition.

See [grep (opens new window)](<https://apidock.com/ruby/v2_5_5/Enumerable/grep>) method definition.

* * *

## [#](<#grep-v>) grep_v

Searches through an enumerator for every element that does not satisfy your condition.

See [grep_v (opens new window)](<https://apidock.com/ruby/v2_5_5/Enumerable/grep_v>) method definition.

* * *

## [#](<#group-by>) group_by

Group arrays into sets.

See [group_by (opens new window)](<http://apidock.com/rails/Enumerable/group_by>) method definition.

* * *

## [#](<#gsub>) gsub

Substitute a pattern with value. Case sensitive.
```ruby
 
    "Jean Marie".gsub(/J/, "M") #"Mean Marie"


```

See [gsub (opens new window)](<https://apidock.com/ruby/String/gsub>) method definition.

* * *

## [#](<#has-key>) has_key?

Returns true if the given key is present in hash.

See [has_key? (opens new window)](<https://apidock.com/ruby/GDBM/has_key%3F>) method definition.

* * *

## [#](<#headers>) headers

Add headers to a request.
```ruby
 
    .headers(Authorization: "Bearer HTB674HJK1")


```

* * *

## [#](<#hmac-md5>) hmac_md5

Creates HMAC_MD5 signature.
```ruby
 
    "username:password:nonce".hmac_md5("key")


```

* * *

## [#](<#hmac-sha1>) hmac_sha1

Creates HMAC_SHA1 signature.
```ruby
 
    "username:password:nonce".hmac_sha1("key")


```

* * *

## [#](<#hmac-sha256>) hmac_sha256

Creates HMAC_SHA256 signature.
```ruby
 
    "username:password:nonce".hmac_sha256("key")


```

* * *

## [#](<#hmac-sha512>) hmac_sha512

Creates HMAC_SHA512 signature.
```ruby
 
    "username:password:nonce".hmac_sha512("key")


```

* * *

## [#](<#ignore-redirection>) ignore_redirection

Allows you to stop a request from being redirected immediately. Commonly used in cases where your requests are redirected to a secondary site like AWS S3 to download a file. You will need to strip any authentication used in the apply: key using "current_url".
```ruby
 
        action_with_ignore_redirection: {
          execute: lambda do |_connection, _input|
     get('https://run.mocky.io/v3/41abc094-6b10-41a9-8201-b15146258b12').ignore_redirection.after_response do |code, body, headers|
       {
         code: code,
         body: body,
         headers: headers
       }
     end
          end
        },


```

* * *

## [#](<#ignored>) ignored

Ignore a comma-separate list of fields.
```ruby
 
    object_definition["user"].ignored("id", "created_at")


```

* * *

## [#](<#include>) include?

Returns true if field contains a value. False otherwise.

See [include? (opens new window)](<https://apidock.com/ruby/String/include%3F>) method definition.

* * *

## [#](<#inject>) inject

Combine elements in an array using an operation.

See [inject (opens new window)](<http://apidock.com/ruby/Enumerable/inject>) method definition.

* * *

## [#](<#insert>) insert

Insert elements into an array.

See [insert (opens new window)](<https://apidock.com/ruby/v2_5_5/Array/insert>) method definition.

* * *

## [#](<#in-time-zone>) in_time_zone

Converts the time to given time zone.
```ruby
 
    "2017-09-06T18:30:15.671720-05:00".to_time.in_time_zone("America/Los_Angeles") #"2017-09-06T16:30:15.671720-07:00"


```

* * *

## [#](<#is-a>) is_a?

Returns true if class is the class of obj, or if class is one of the superclasses of obj or modules included in obj.

Workato currently supports the following classes:

  * Array
  * Hash
  * Time
  * String
  * Integer
  * Float

See [is_a? (opens new window)](<https://apidock.com/ruby/Object/is_a%3F>) method definition.

* * *

## [#](<#is-true>) is_true?

Converts a value to boolean and returns true if value is truthy.

* * *

## [#](<#is-not-true>) is_not_true?

Converts a value to boolean and returns true if value is not truthy.

* * *

## [#](<#iso8601>) iso8601

Convert a date/date-time variable to ISO8601 format.

* * *

## [#](<#join>) join

Join array elements into a string.

See [join (opens new window)](<https://apidock.com/ruby/Array/join>) method definition.

* * *

## [#](<#jwt-decode>) jwt_decode

Decodes a JSON web token (JWT) using one of the following algorithms:

  * RS256
  * RS384
  * RS512
  * HS256
  * HS384
  * HS512
  * ES256
  * ES384
  * ES512

```ruby
 
    workato.jwt_decode( "eyJhbGciO...", "PEM key", \'RS256\') # => {"payload" => {"sub"=>"123", "name"=>"John", ...}, "header" => {"typ"=>"JWT", "alg"=>"RS256"}}
    workato.jwt_decode( "eyJhbGciO...", "PEM key", \'RS512\') # => {"payload" => {"sub"=>"123", "name"=>"John", ...}, "header" => {"typ"=>"JWT", "alg"=>"RS512"}}
    workato.jwt_decode( "eyJhbGciO...", "my$ecretK3y", \'HS256\') # => {"payload" => {"sub"=>"123", "name"=>"John", ...}, "header" => {"typ"=>"JWT", "alg"=>"HS256"}}


```

* * *

## [#](<#jwt-encode>) jwt_encode

Creates a JSON web token (JWT) using one of the following algorithms:

  * RS256
  * RS384
  * RS512
  * HS256
  * HS384
  * HS512
  * ES256
  * ES384
  * ES512

Adds other named parameters to the header, such as `kid` in the following example:
```ruby
 
    workato.jwt_encode({ name: "John Doe" }, "PEM key", 'RS256') # => "eyJhbGciO..."
    workato.jwt_encode({ name: "John Doe" }, "PEM key", 'RS512', kid: "24668") #=> "eyJ0eXAiO..."
    workato.jwt_encode({ name: "John Doe" }, "my$ecretK3y", 'HS256', kid: "24668") #=> "eyJ0eXAiO..."
    workato.jwt_encode({ name: "John Doe" }, "my$ecretK3y", 'HS256') #=> "eyJ0eXAiO..."
    workato.jwt_encode({ name: "John Doe" }, "ECDSA Key", 'ES256') #=> "eyJhbGciOiJ..."


```

* * *

## [#](<#last>) last

Returns the last item in a list. Can also be used to return the last n items in a list.

See [last (opens new window)](<https://apidock.com/ruby/Array/last>) method definition.

* * *

## [#](<#ljust>) ljust

Aligns strings to the left and pads with whitespace or specified pattern until string is the required length.
```ruby
 
    " test".ljust(10, "*") # " test*****"


```

See [ljust (opens new window)](<https://apidock.com/ruby/String/ljust>) method definition.

* * *

## [#](<#lookup>) lookup

Lookup a record from your lookup tables defined in Workato.
```ruby
 
    lookup('States list', 'State code': 'AZ')['State name'] #"Arizona"


```

See [lookup](</formulas/other-formulas.html#lookup>) method definition.

* * *

## [#](<#lstrip>) lstrip

Remove white space from the beginning of string.
```ruby
 
    "     Test     ".lstrip #"Test     "


```

See [lstrip (opens new window)](<https://apidock.com/ruby/String/lstrip>) method definition.

* * *

## [#](<#map>) map

Returns a new array after invoking block on each element.

* * *

## [#](<#md5-hexdigest>) md5_hexdigest

Creates message digest using the MD5 Message-Digest Algorithm.
```ruby
 
    "hello".md5_hexdigest #5d41402abc4b2a76b9719d911017c592


```

* * *

## [#](<#match>) match?

Returns true if a string contains a pattern. Case sensitive.
```ruby
 
    "Jean Marie".match?(/Marie/) #true


```

* * *

## [#](<#max-by>) max_by

Returns the object in enum that gives the maximum value from the given block.
```ruby
 
    %w(albatross dog horse).max_by { |x| x.length } # albatross


```

* * *

## [#](<#member>) member?

Alias of include?

See [member? (opens new window)](<https://apidock.com/ruby/v2_5_5/Enumerable/member%3F>) method definition.

* * *

## [#](<#merge>) merge

Returns a new hash containing merged contents.

See [merge (opens new window)](<https://ruby-doc.org/core-2.2.0/Hash.html#method-i-merge>) method definition.

* * *

## [#](<#minmax>) minmax

Returns a two element array which contains the minimum and the maximum value in the enumerable.
```ruby
 
    a = %w(albatross dog horse)
    a.minmax    #=> ["albatross", "horse"]
    a.minmax { |a, b| a.length <=> b.length }
    #=> ["dog", "albatross"]


```

See [minmax (opens new window)](<https://apidock.com/ruby/v2_5_5/Enumerable/minmax>) method definition.

* * *

## [#](<#minmax-by>) minmax_by

Returns a two element array containing the objects in enum that correspond to the minimum and maximum values respectively from the given block.
```ruby
 
    a = %w(albatross dog horse)
    a.minmax_by { |x| x.length }   #=> ["dog", "albatross"]


```

See [minmax_by (opens new window)](<https://apidock.com/ruby/v2_5_5/Enumerable/minmax_by>) method definition.

* * *

## [#](<#min-by>) min_by

Returns the object in enum that gives the minimum value from the given block
```ruby
 
    a = %w(albatross dog horse)
    a.min_by { |x| x.length }   #=> "dog"


```

See [min_by (opens new window)](<https://apidock.com/ruby/v2_5_5/Enumerable/min_by>) method definition.

* * *

## [#](<#net-lookup>) net.lookup

Lookups specified DNS records for a given host.
```ruby
 
    workato.net.lookup("www.google.com", "A") # => [{"address": "172.253.122.106"}, {"address":"172.253.122.103"}]


```

Takes two arguments:

  * name

  * The resource name such as the domain or host.

  * Record Type

  * Only supports "SRV" or "A" DNS record types

* * *

## [#](<#next>) next

Returns the next object in the enumerator, and move the internal position forward.

This is often used in config_fields where you can use `next` as a way to add a guard clause that checks inputs before the lambda function is executed.
```ruby
 
    object_definitions: {
      document: {
        fields: lambda do |connection, config_fields, object_definitions|
          next [] if config_fields.blank?
          get("https://www.webmerge.me/api/documents/#{config_fields["document_id"]}/fields").map {
     |field| field.slice("name")
          }
        end
      }
    }


```

See [next (opens new window)](<https://apidock.com/ruby/Enumerator/next>) method definition.

* * *

## [#](<#none>) none?

Passes each element of the collection to the given block. The method returns true if the block never returns true for all elements.
```ruby
 
    %w{ant bear cat}.none? { |word| word.length == 5 } #=> true


```

See [none? (opens new window)](<https://apidock.com/ruby/v2_5_5/Enumerable/none%3F>) method definition.

* * *

## [#](<#now>) now

Returns timestamp of the moment that the formula was executed in Pacific Time (UTC-8/UTC-7).
```ruby
 
    now #2017-01-23T14:04:53.365908-08:00
    now + 2.days #2017-01-25T14:04:53.365908-08:00


```

* * *

## [#](<#odd>) odd?

Returns true if integer is an odd number. See [odd? (opens new window)](<https://apidock.com/ruby/Integer/odd%3F>) method definition.

* * *

## [#](<#one>) one?

Passes each element of the collection to the given block. The method returns true if the block returns true exactly once.
```ruby
 
    [ nil, true, false ].one? #=> true


```

See [one? (opens new window)](<https://apidock.com/ruby/v2_5_5/Enumerable/one%3F>) method definition.

* * *

## [#](<#only>) only

White list a comma-separate of fields.
```ruby
 
    object_definition["user"].only("id", "name")


```

* * *

## [#](<#ordinalize>) ordinalize

Turns a number into an ordinal string used to denote the position in an ordered sequence such as first, second, third, fourth.
```ruby
 
    "1".ordinalize # "First"


```

* * *

## [#](<#pack>) pack

Packs contents of an array into a binary sequence.

See [pack (opens new window)](<https://apidock.com/ruby/Array/pack>) method definition.

* * *

## [#](<#parallel>) parallel

Accepts an array of requests and allows you to execute them in multiple threads.
```ruby
 
    batches = (0..200).map do |batch|
      post(url).headers(headers).request_body(payload)
    end
    results = parallel(batches, threads: 20)


```

See [Multi-threaded actions](</developing-connectors/sdk/guides/building-actions/multi-threaded-actions.html>) for more information.

* * *

## [#](<#parameterize>) parameterize

Replaces special characters in a string.
```ruby
 
    "öüâ".parameterize #"oua"


```

* * *

## [#](<#params>) params

Add parameter to a request.
```ruby
 
    .params(api_key: "HTB674HJK1")


```

* * *

## [#](<#parse-json>) parse_json

Works the same way as json.parse.

See [parse_json (opens new window)](<https://apidock.com/ruby/v1_9_3_392/JSON/parse>) method definition.

* * *

## [#](<#parse-yaml>) parse_yaml

Parse a YAML string. Supports true, false, nil, numbers, strings, arrays, hashes.
```ruby
 
    workato.parse_yaml("---\nfoo: bar") # => { "foo" => "bar" }


```

* * *

## [#](<#payload>) payload

Add payload to a request.
```ruby
 
    .payload(id: "345")


```

* * *

## [#](<#pbkdf2-hmac-sha1>) pbkdf2_hmac_sha1

Create keys of varying bit lengths using a password and a salt. Uses HMAC Sha1.
```ruby
 
    key128 = workato.pbkdf2_hmac_sha1("password", workato.random_bytes(8))
    key192 = workato.pbkdf2_hmac_sha1("password", workato.random_bytes(8), 1000, 24)
    key256 = workato.pbkdf2_hmac_sha1("password", workato.random_bytes(8), 1000, 32)


```

* * *

## [#](<#pluck>) pluck

Select one or more attributes from an array of objects.
```ruby
 
    [
      {"id": 1, "name": "David"},
      {"id": 2, "name": "Peter"}
    ].pluck("id")


```

Returns `[1, 2]`.

* * *

## [#](<#pluralize>) pluralize

Returns the plural form of the word in the string.

See [pluralize (opens new window)](<https://apidock.com/rails/String/pluralize>) method definition.

* * *

## [#](<#pop>) pop

Removes the last element from self and returns it, or nil if the array is empty.

If a number n is given, returns an array of the last n elements (or less) and removes it from array.
```ruby
 
    a = [ "a", "b", "c", "d" ]
    a.pop     #=> "d"
    a.pop(2)  #=> ["b", "c"]
    a  #=> ["a"]


```

See [pop (opens new window)](<https://apidock.com/ruby/Array/pop>) method definition.

* * *

## [#](<#presence>) presence

Returns the value if present. Otherwise returns nil.
```ruby
 
    nil.presence #nil
    "".presence #nil
    0.presence #0


```

See [presence (opens new window)](<https://apidock.com/rails/Object/presence>) method definition.

* * *

## [#](<#present>) present?

Returns true if the field has a value. False otherwise.
```ruby
 
    nil.present? #false
    "".present? #false
    0.present? #true


```

See [present? (opens new window)](<https://apidock.com/rails/Object/present%3F>) method definition.

* * *

## [#](<#puts>) puts

Ruby version of `console.log` or `stdout`. Not the same as the `put` method.

Any output using the `puts` method shows up in the console log when testing in the code editor. Use this to aid in your debugging.

* * *

## [#](<#rand>) rand

Random number between 0 and 1.

* * *

## [#](<#random-bytes>) random_bytes

Generates a specified number of random bytes.
```ruby
 
    workato.random_bytes(8)


```

* * *

## [#](<#reduce>) reduce

Combines all elements of enum by applying a binary operation, specified by a block or a symbol that names a method or operator.
```ruby
 
    (5..10).reduce { |sum, n| sum + n } # 45


```

See [reduce (opens new window)](<https://apidock.com/ruby/v2_5_5/Enumerable/reduce>) method definition.

* * *

## [#](<#reinvoke-after>) reinvoke_after

Used in multistep actions that work with asynchronous APIs. Calling this method causes the job to pause for a specific interval before reinvoking the original `execute` lambda it is called in. Accepts `seconds` to denote how long the job should pause for, and `continue` which allows the job to be reinvoked with additional context.
```ruby
 
    reinvoke_after(
      seconds: step_time, 
      continue: { 
        current_step: current_step + 1, 
        jobid: response['jobReference']['jobId'] 
      }
    )


```

See [Multistep actions](</developing-connectors/sdk/guides/building-actions/multistep-actions.html>) for more information.

* * *

## [#](<#reject>) reject

Selectively returns elements for which the block returns false. Similar but opposite of **select**.

See [reject (opens new window)](<http://apidock.com/ruby/v1_9_3_392/Array/reject>) method definition.

* * *

## [#](<#render-yaml>) render_yaml

Render an object into a YAML string.
```ruby
 
    workato.render_yaml({ "foo" => "bar" }) # => "---\nfoo: bar\n"


```

* * *

## [#](<#response-format-json>) response_format_json

Expect response in JSON format.

* * *

## [#](<#response-format-raw>) response_format_raw

Expect response in raw format. This can be chained after HTTP actions that expect binary data (such as PDFs and images) as responses.

* * *

## [#](<#response-format-xml>) response_format_xml

Expect response in XML format. Takes 1 argument.

  * strip_response_namespaces
  * Strips namespaces from XML responses.

* * *

## [#](<#request-format-json>) request_format_json

Convert request to JSON format.

* * *

## [#](<#request-format-multipart-form>) request_format_multipart_form

Convert request to multipart_form format.

* * *

## [#](<#request-format-raw>) request_format_raw

Convert request to raw format.

* * *

## [#](<#request-format-www-form-urlencoded>) request_format_www_form_urlencoded

Convert request to URL-encoded format.

* * *

## [#](<#request-format-xml>) request_format_xml

Convert request to XML format.

Takes two arguments:

  * root_element_name

  * Adds a root element tag to your outgoing XML payload.

  * namespaces

  * Adds additional tags to your payload for namespaces

## [#](<#required>) required

Make a comma-separate list of fields required.
```ruby
 
    object_definition["user"].required("id", "created_at")


```

* * *

## [#](<#reverse>) reverse

Reverse string or array.

* * *

## [#](<#reverse-each>) reverse_each

Builds a temporary array and traverses that array in reverse order.

See [reverse_each (opens new window)](<https://apidock.com/ruby/v2_5_5/Enumerable/reverse_each>) method definition.

* * *

## [#](<#rjust>) rjust

Aligns string to right and pads with whitespace or pattern until string is specified length.
```ruby
 
    "test".rjust(5) #" test"
    "test".rjust(10, "*!") #"*!*!* test"


```

See [rjust (opens new window)](<https://apidock.com/ruby/String/rjust>) method definition.

* * *

## [#](<#round>) round

Round the number by regular rounding rules.
```ruby
 
    11.99.round #12
    11.555.round(2) #11.56


```

See [round (opens new window)](<https://apidock.com/ruby/Float/round>) method definition.

* * *

## [#](<#rsa-sha256>) rsa_sha256

Creates a RS256 signature (SHA256 hash signed with an RSA key)
```ruby
 
    input['StringToSign'].rsa_sha256(rsa_private_key).base64


```

* * *

## [#](<#rsa-sha512>) rsa_sha512

Creates a RS512 signature (SHA512 hash signed with an RSA key).
```ruby
 
    input['StringToSign'].rsa_sha512(rsa_private_key).base64


```

* * *

## [#](<#rstrip>) rstrip

Remove white space from the end of string.
```ruby
 
    " Test ".rstrip #" Test"


```

See [rstrip (opens new window)](<https://apidock.com/ruby/String/rstrip>) method definition.

* * *

## [#](<#scan>) scan

Scans the string for a matching pattern.
```ruby
 
    "Thu, 01/23/2014".scan(/\d+/).join("-") #01-23-2014


```

See [scan (opens new window)](<https://apidock.com/ruby/String/scan>) method definition.

* * *

## [#](<#scrub>) scrub

If the string is invalid byte sequence then replace invalid bytes with given replacement character, else returns self.
```ruby
 
    "abc\u3042\x81".scrub("*") # "abc\u3042*"


```

See [scrub (opens new window)](<https://apidock.com/ruby/v2_5_5/String/scrub>) method definition.

* * *

## [#](<#select>) select

Selectively returns elements for which the block returns true.

See [select (opens new window)](<http://apidock.com/ruby/v1_9_3_392/Array/select>) method definition.

* * *

## [#](<#sha1>) SHA1

Encrypts a given string using the SHA1 encryption algorithm.
```ruby
 
    "abcdef".sha1.encode_base64 # "H4rBDyPFtbwRZ72oS4M+XAV6d9I="


```

See [SHA1 (opens new window)](<https://ruby-doc.org/stdlib-2.4.0/libdoc/digest/rdoc/Digest/SHA1.html>) method definition.

* * *

## [#](<#singularize>) singularize

The reverse of `pluralize`. Returns the singular form of a word in a string.
```ruby
 
    'posts'.singularize # => "post"


```

See [singularize (opens new window)](<https://apidock.com/rails/String/singularize>) method definition.

* * *

## [#](<#slice>) slice

Returns a substring of a given string, as defined by start indexes and length.
```ruby
 
    "Jean Marie\.slice(0,3) #"Jea"


```

See [slice (opens new window)](<https://apidock.com/ruby/String/slice>) method definition.

* * *

## [#](<#slice-after>) slice_after

Slices an array after a specific value.
```ruby
 
    ["a", "b", "c"].slice_after("b").to_a # [["a", "b"], ["c"]]


```

See [slice_after (opens new window)](<https://apidock.com/ruby/v2_5_5/Enumerable/slice_after>) method definition.

* * *

## [#](<#slice-before>) slice_before

Slices an array before a specific value.
```ruby
 
    ["a", "b", "c"].slice_before("b").to_a # [["a"], ["b", "c"]]


```

See [slice_before (opens new window)](<https://apidock.com/ruby/v2_5_5/Enumerable/slice_before>) method definition.

* * *

## [#](<#slice-when>) slice_when

Creates an enumerator for each chunked elements.
```ruby
 
    [1,2,4,9,10,11].slice_when { |i,j| i+1 != j}.to_a # [[1, 2], [4], [9, 10, 11]]


```

See [slice_when (opens new window)](<https://apidock.com/ruby/Enumerable/slice_when>) method definition.

* * *

## [#](<#smart-join>) smart_join

Join array to string. Removes empty and nil values. Trims the white space before joining.
```ruby
 
    [nil, " ", " Hello ", "   World "].smart_join(" ") #Hello World


```

See [smart_join](</formulas/array-list-formulas.html#smart-join>) method definition.

* * *

## [#](<#sort>) sort

Sort function returning new sorted array.

See [sort (opens new window)](<http://apidock.com/ruby/v1_9_3_392/Array/sort>) method definition.

* * *

## [#](<#sort-by>) sort_by

Sort function returning self.

See [sort_by (opens new window)](<https://apidock.com/ruby/Enumerable/sort_by>) method definition.

* * *

## [#](<#split>) split

Split string into an array by using defined pattern as delimiter.
```ruby
 
    "Split string".split() #["Split", "string"]
    "Split string".split("t") #["Spli", " s", "ring"]


```

See [split (opens new window)](<https://apidock.com/ruby/String/split>) method definition.

* * *

## [#](<#stream-out>) stream.out

Used in file stream producing actions that work with any of Workato's file streaming enabled connectors. Calling this method allows you to specify a `streaming` callback that is invoked when a downstream action downloads the file.
```ruby
 
    workato.stream.out("download_file", { file_id: file_id })


```

See [file streaming](</developing-connectors/sdk/guides/building-actions/streaming.html>) for more information.

* * *

## [#](<#stream-in>) stream.​in

Used in file stream consuming actions that work with any of Workato's file streaming enabled connectors. Calling this method allows you to specify a code block that can utilize a file stream to upload a file in chunks.

This method takes three arguments:

  1. the first positional argument being the file contents from a previous action
  2. `from` which is used to override the default offset of `0`. This will be used in implementing multi-step streaming
  3. `frame_size` which is used to override the size requested from a stream producer.

```ruby
 
    workato.stream.in(input["file"], from: previous_offset, frame_size: required_frame_size) do |chunk, starting_byte_range, ending_byte_range, eof, next_starting_byte_range| 
      put("/file/#{input['file_id']}").
        headers("Content-Range": "byte #{starting_byte_range}-#{ending_byte_range}/*").
        request_body(chunk).
        presence
    end


```

See [file streaming](</developing-connectors/sdk/guides/building-actions/streaming.html>) for more information.

* * *

## [#](<#strip>) strip

Strip white spaces from the beginning and the end of string.
```ruby
 
    "    This is an example   ".strip #"This is an example"


```

See [strip (opens new window)](<https://apidock.com/ruby/String/strip>) method definition.

* * *

## [#](<#strip-tags>) strip_tags

Strip html tags from the string.
```ruby
 
    "<html><body>Double bubble</body></html>".strip_tags #"Double bubble"


```

* * *

## [#](<#strftime>) strftime

Format date or time using %-placeholders.

* * *

## [#](<#sub>) sub

Substitute the first occurrence of a pattern with value.
```ruby
 
    "Mean Marie".sub(/M/, "J") #"Jean Marie"
    "Hello".sub(/[aeiou]/, "\*") #"H*llo"


```

* * *

## [#](<#suspend>) suspend

This method is used in [Wait for resume actions](</developing-connectors/sdk/guides/building-actions/wait-for-resume-actions.html>). These actions work with external systems that can send an API request when a long running process is complete. Calling this method suspends the job until Workato receives a corresponding request to its developer API, or until the specified suspension time expires.
```ruby
 
    suspend(
      continue: { 
        "state" => "suspended", 
        "url" => input['url']
      }, 
      expires_at: 10.minutes.from_now
    )


```

  * `continue`: This hash is passed to the `before_suspend`, `before_resume`, and `before_timeout_resume` lambdas.
  * `expires_at`: This is the time in PST that the job waits for a request to resume. After this time, the job continues with a `timeout` call. The maximum timeout is 60 days.

* * *

## [#](<#take>) take

Returns first N elements from an array.
```ruby
 
    [1, 2, 3, 4, 5, 0].take(3) #=> [1, 2, 3]


```

See [take (opens new window)](<https://apidock.com/ruby/v2_5_5/Enumerable/take>) method definition.

* * *

## [#](<#take-while>) take_while

Passes elements to the block until the block returns nil or false, then stops iterating and returns an array of all prior elements.
```ruby
 
    [1, 2, 3, 4, 5, 0].take_while { |i| i < 3 } #=> [1, 2]


```

See [take_while (opens new window)](<https://apidock.com/ruby/Array/take_while>) method definition.

* * *

## [#](<#tap>) tap

Yields x to the block, and then returns x.

The `tap` method is often used for transformation. For example, we can use the `tap` method to transform a webhook's payload. Consider the following example:
```ruby
 
    {
      "id" => {"value" => 1},
      "name" => {"value" => 2}
    }


```

If a webhook payload is delivered in this format, you can use `tap` to transform it into a more user friendly JSON.
```ruby
 
    webhook_notification: lambda do |input, payload|
      payload.tap do |output|
        output.each { |k, v| output[k] = v["value"] }
      end
    end


```

The final JSON will look as follows: `{"id"=>1, "name"=>2}`

See [tap (opens new window)](<https://apidock.com/ruby/Object/tap>) method definition.

* * *

## [#](<#tls-client-cert>) tls_client_cert

Allows you to dictate the TLS keys, TLS client, and intermediate certificates to be used in the request. Can be used by chaining it in a single request or used generally in the apply block.
```ruby
 
    get("https://www.exampleapi.com").
      tls_client_cert(
        certificate: connection['ssl_client_cert'],
        key: connection['ssl_client_key'],
        passphrase: connection['ssl_key_passphrase'],
        intermediates: connection['client_intermediate_certs'] # pass array if there are multiple intermediate certs
      )


```
```ruby

    apply: lambda do |connection|
      tls_client_cert(
        certificate: connection['ssl_client_cert'],
        key: connection['ssl_client_key'],
        passphrase: connection['ssl_key_passphrase'],
        intermediates: connection['client_intermediate_certs'] # pass array if there are multiple intermediate certs
      )
    end


```

* * *

## [#](<#tls-server-certs>) tls_server_certs

Allows you to dictate the TLS server certificates we should accept during the SSL handshake process. This is useful for self-signed or untrusted root CA certificates. Can be used by chaining it in a single request or used generally in the apply block.
```ruby
 
    get("https://www.exampleapi.com").
      tls_server_certs(
        certificates: [connection['server_ca_cert']], #additional intermediate server certificates can be given.
        strict: false # Set to true to only allow requests from the given server CA cert.
      )


```
```ruby

    apply: lambda do |connection|
      tls_server_certs(
        certificates: [connection['server_ca_cert']], #additional intermediate server certificates can be given.
        strict: false # Set to true to only allow requests from the given server CA cert.
      )
    end


```

* * *

## [#](<#to-currency>) to_currency

Convert to currency string.
```ruby
 
    1234567890.50.to_currency    # $1,234,567,890.50


```

* * *

## [#](<#to-currency-code>) to_currency_code

Convert alpha-2/3 country code or country name to ISO4217 currency code.
```ruby
 
    "India".to_currency_code #INR


```

* * *

## [#](<#to-currency-name>) to_currency_name

Convert alpha-2/3 country code or country name to ISO4217 currency name.
```ruby
 
    "India".to_currency_name #Rupees


```

* * *

## [#](<#to-currency-symbol>) to_currency_symbol

Convert alpha-2/3 country code or country name to ISO4217 currency symbol.
```ruby
 
    "India".to_currency_symbol # ₨


```

* * *

## [#](<#to-country-alpha2>) to_country_alpha2

Convert alpha-3 country code or country name to alpha2 country code.
```ruby
 
    "India".to_country_alpha2 #IN
    "IND".to_country_alpha2 #IN


```

* * *

## [#](<#to-country-alpha3>) to_country_alpha3

Convert alpha-2 country code or country name to alpha3 country code.
```ruby
 
    "Australia".to_country_alpha2 #AUS
    "AU".to_country_alpha2 #AUS


```

* * *

## [#](<#to-country-name>) to_country_name

Convert alpha-2/3 country code or country name to ISO3166 country name.
```ruby
 
    "GB".to_country_name #United Kingdom
    "GBR".to_country_name #United Kingdom


```

* * *

## [#](<#to-country-number>) to_country_number

Convert alpha-2/3 country code or country name to ISO3166 country numeric code.
```ruby
 
    "India".to_country_number #356


```

* * *

## [#](<#to-date>) to_date

Convert string or timestamp to date. Can be formatted.
```ruby
 
    "12/24/2014 10:30 PM".to_date(format: "MM/DD/YYYY")


```

* * *

## [#](<#to-f>) to_f

Convert to float. Numbers are rounded up or down according to regular rounding rules.
```ruby
 
    45.to_f #45.0


```

* * *

## [#](<#to-hex>) to_hex

Converts binary string to its hex representation.

* * *

## [#](<#to-i>) to_i

Convert to integer. Decimals are always rounded down.
```ruby
 
    45.67.to_i #45


```

* * *

## [#](<#to-json>) to_json

Converts hash or array into JSON string.
```ruby
 
    {"a" => "c d", "2" => "3"}.to_json #"{"a":"c d","2":"3"}"


```

* * *

## [#](<#to-phone>) to_phone

Convert string or number to a formatted phone number.
```ruby
 
    5551234.to_phone # 555-1234
    1235551234.to_phone(area_code: true) # (123) 555-1234
    1235551234.to_phone(delimiter: " ") # 123 555 1234
    1235551234.to_phone(country_code: 1) # +1-123-555-1234


```

* * *

## [#](<#to-param>) to_param

Returns a string representation for use as a URL query string.
```ruby
 
    {name: 'Jake', age: '22'}.to_param #name=Jake&age=22


```

* * *

## [#](<#to-s>) to_s

Convert to string.
```ruby
 
    45.67.to_s #"45.67"


```

* * *

## [#](<#to-state-code>) to_state_code

Convert state name to code.
```ruby
 
    "California".to_state_code #CA


```

* * *

## [#](<#to-state-name>) to_state_name

Convert state code to name.
```ruby
 
    "CA".to_state_name #"CALIFORNIA"


```

* * *

## [#](<#to-time>) to_time

Convert string or date to timestamp.
```ruby
 
    "2014-11-21".to_time #2014-11-21 00:00:00 +0000


```

* * *

## [#](<#to-xml>) to_xml

Converts hash or array into XML string.
```ruby
 
    {"name" => "Ken"}.to_xml(root: "user") # &#60;user&#62;&#60;name&#62;Ken&#60;/name&#62;&#60;/user&#62;


```

* * *

## [#](<#today>) today

Date today. Returns the date of the moment that the formula was executed, in Pacific time (UTC-8/UTC-7).
```ruby
 
    today #2016-07-13
    today + 2.days #2016-07-15


```

* * *

## [#](<#transliterate>) transliterate

Replaces non-ASCII characters with an ASCII approximation, or if none exists, a replacement character which defaults to '?'.
```ruby
 
    'Chloé'.transliterate #Chloe


```

* * *

## [#](<#upcase>) upcase

Convert string to upper case.
```ruby
 
    "Convert to UPCASE".upcase #"CONVERT TO UPCASE"


```

* * *

## [#](<#uniq>) uniq

Return unique items in an array.
```ruby
 
    [1.0, 1.5, 1.0].uniq #[1.0, 1.5]


```

* * *

## [#](<#unpack>) unpack

Decodes a string into an array.

See [unpack (opens new window)](<https://apidock.com/ruby/String/unpack>) method definition.

* * *

## [#](<#utc>) utc

Convert Time to UTC timezone.

See [utc (opens new window)](<http://ruby-doc.org/core-2.2.0/Time.html#method-c-utc>) method definition.

* * *

## [#](<#uuid>) uuid

Creates a UUID. Useful when sending strings that are unique in a request.
```ruby
 
    workato.uuid #c52d735a-aee4-4d44-ba1e-bcfa3734f553 => "eyJhbGciO..."


```

* * *

## [#](<#wday>) wday

Returns day of the week where 1 is Monday.

* * *

## [#](<#where>) where

Filter array by given condition.

* * *

## [#](<#while>) while

While loop statement.

See [ruby_loops (opens new window)](<https://www.tutorialspoint.com/ruby/ruby_loops.htm>) method definition.

* * *

## [#](<#wrap>) wrap

Wraps its argument in an array unless it is already an array

The wrap method is often used in the execute block of the while loop statement.
```ruby
 
    execute: lambda do |connection, input|
    {
        accounts: Array.wrap(get("/accounts", input)["records"])
      }
    end


```

This ensures that the `accounts` variable is always an array in spite of whatever return. At Workato, we often use this to guard against unexpected returns from the various APIs we work with.

See [wrap (opens new window)](<https://apidock.com/rails/Array/wrap/class>) method definition.

* * *

## [#](<#yday>) yday

Returns day of the year.
```ruby
 
    "2016-07-19 10:45:30".to_time.yday #201


```

* * *

## [#](<#yweek>) yweek

Returns week of the year.
```ruby
 
    "2016-07-19 10:45:30".to_time.yweek #29


```

* * *

## [#](<#zip>) zip

Used as a method called by arrays. Converts any arguments to arrays, then merges elements of self with corresponding elements from each argument.

See [zip (opens new window)](<https://apidock.com/ruby/Array/zip>) method definition.

```

### references/sdk-reference__streams.md

```markdown
# Workato SDK Documentation

> **Source**: https://docs.workato.com/en/developing-connectors/sdk/sdk-reference/streams.html
> **Fetched**: 2026-01-18T02:50:36.401590

---

# [#](<#sdk-reference-streams>) SDK Reference - `streams`

This section enumerates all the possible keys to define a streaming callback that enables you to create file stream producing actions. [Learn more about file streaming.](</developing-connectors/sdk/guides/building-actions/streaming.html>)

Quick overview

The `streams` key must be used in conjunction with an action or trigger. It enables you to download large amounts of data such as a CSV file or video in chunks from a compatible API. This allows you to build actions that can connect to Workato's ecosystem of file storage providers such as Workato Files, Google Cloud Storage, S3 and many more.

## [#](<#structure>) Structure
```ruby
 
        streams: {

          [Unique_stream_name]: lambda do |input, starting_byte_range, ending_byte_range, byte_size|
            Array
          end, 

          [Another_unique_stream_name]: lambda do |input, starting_byte_range, ending_byte_range, byte_size|
            Array
          end, 
        },


```

* * *

Attribute | Description  
---|---  
Key | `[Unique_stream_name]`  
Type | lambda function  
Description | This lambda function can be invoked by any streaming action using the `workato.stream.out` callback.  
Possible Arguments | `input` \- Hash representing user given inputs defined in `workato.stream.out`   
`starting_byte_range` \- Integer representing the requested start byte range for this particular chunk.   
`ending_byte_range`\- Integer representing the requested ending byte range for this particular chunk.   
`byte_size`\- Integer representing the exact amount of bytes for this particular chunk.  
Expected Output | Array of size 2. The first index represents the actual bytes for this particular chunk. The second index is a boolean value that tells the Workato framework whether this is the last chunk in the file.  
Creating a file stream

File streams on Workato are made by leveraging the common [HTTP RFC standard for `Range` headers (opens new window)](<https://datatracker.ietf.org/doc/html/rfc7233>). Below we have a simple download file action with file streaming.
```ruby
 
    actions: {
      download_file: {
        title: "Download file",

        input_fields: lambda do 
          [
            {
              name: "file_id",
              label: "File ID"
            }
          ]
        end,

        execute: lambda do
          {
            file_contents: workato.stream.out("download_file", { file_id: file_id })
          }
        end,

        output_fields: lambda do 
          [
            {
              name: "file_contents"
            } 
          ]
        end
      }
    }


```

The stream `download_file` defined in the `workato.stream.out` method is responsible for holding the code that retrieves a specific range of bytes requested by the platform - which will be sent over to a stream consumer to be uploaded into a downstream destination.

As such, the arguments passed to this callback provide you clear inputs that you can use in your HTTP requests to retrieve this range of bytes.

The output of the stream lambda is an array which expects the byte string in the first index and in the second index, a boolean value which should be true if this is the end of the file.
```ruby
 
    streams: {
        download_file: lambda do |input, starting_byte_range, ending_byte_range, byte_size|
          # Example starting_byte_range = 0
          # Example ending_byte_range = 10485759 
          # Example byte_size = 10485760 (10MB)
          # input passed from action can be assumed to be a friendly URL
          chunk = get("/#{input['file_id']}/download").
            headers("Range": "bytes=#{starting_byte_range}-#{ending_byte_range}").
            response_format_raw
          # if the chunk.size is smaller than the requested byte_size, 
          # then we know we are at the end of the file.
          [chunk, chunk.size < byte_size]
        end
    }


```

Take note that the `download_file` lambda is only executed when the datapill for `file_contents` is mapped to a downstream action.

```

### references/sdk-reference__test.md

```markdown
# Workato SDK Documentation

> **Source**: https://docs.workato.com/en/developing-connectors/sdk/sdk-reference/test.html
> **Fetched**: 2026-01-18T02:50:37.518282

---

# [#](<#sdk-reference-test>) SDK Reference - `test`

This section enumerates all the possible keys available when testing your connection.

Quick Overview

The `test` lambda tells your connector how to check if the connection is valid. After it has taken the input from the user and executed the `authorization` block, this test verifies that the credentials supplied are valid via a simple HTTP request.

The `test` lambda is executed when a connection a user first clicks connect. The only exception is for OAuth2 authorization code grant connections, where the connection is marked as connected when Workato has successfully exchanged the authorization code for access tokens.

The `test` lambda is also executed for all types of connections upon recipe start and job rerun to ensure that the connection's credentials are still valid.

## [#](<#structure>) Structure
```ruby
 
        test: lambda do |connection|
          # see test: documentation for more information
        end


```

* * *

## [#](<#test>) `test`

Attribute | Description  
---|---  
Key | `test`  
Type | lambda function  
Required | True  
Description | A simple HTTP request that can verify that we have established a successful connection. This connection is marked as "Successful" when the HTTP response is 2XX.  
Example - test:

APIs normally provide an endpoint that returns information about the authenticated user. These endpoints are ideal for your connector to verify that connection has been established.
```ruby
 
        test: lambda do |connection|
          get('/api/v5/me')
        end


```

In cases where this is not available, you may also choose to use simple requests. Normally this could be to search for results in the target API. These requests should also allow you to verify that the connection is valid.
```ruby
 
        test: lambda do |connection|
          get("https://person.clearbit.com/v1/people/email/[[email protected]](</cdn-cgi/l/email-protection>)")
        end


```

```

### references/sdk-reference__custom-action.md

```markdown
# Workato SDK Documentation

> **Source**: https://docs.workato.com/en/developing-connectors/sdk/sdk-reference/custom-action.html
> **Fetched**: 2026-01-18T02:50:28.091263

---

# [#](<#sdk-reference-custom-action>) SDK Reference - `custom_action`  

This section enumerates all the possible keys to define a custom action.

Quick Overview

The `custom_action` key allows you to quickly define custom actions to unblock users of your connector when no standard action is available to them. Keep in mind that these actions require users to understand certain API concepts like how to find the relevant API endpoints and payload schema.

## [#](<#structure>) Structure
```ruby
 
        custom_action: Boolean,

        custom_action_help: {
          learn_more_url: String,

          learn_more_text: String,

          body: String
        }


```

* * *

## [#](<#custom-action>) `custom_action`

Attribute | Description  
---|---  
Key | `custom_action`  
Type | Boolean  
Required | Optional. Defaults to false where no custom action is added to your connector. Set to true to add custom actions as an option for your users.  
Description | This adds a custom action to your connector.  
Expected Output | `Boolean`   
i.e. `true`  
UI reference | ![](/assets/img/custom_action.981c720d.png)  

* * *

## [#](<#custom-action-help>) `custom_action_help`

Attribute | Description  
---|---  
Key | `custom_action_help`  
Type | Hash  
Required | Optional. If custom_action is `true`, then this hash allows you to customize the help text in your action.  
Description | Allows you to configure the help body, help button url and label.  
Expected Output | `Hash` See below for more information  
UI reference | ![](/assets/img/custom_action_help.125b64ae.png)  

TIP

Custom action help is important to guide users to the proper websites to collect information such as API documentation.

* * *

## [#](<#learn-more-url>) `learn_more_url`

Attribute | Description  
---|---  
Key | `learn_more_url`  
Type | String  
Required | Optional.  
Description | Defines the URL to send users when they click on the help link in the custom action.  
Expected Output | `'www.api-reference.com'`  

* * *

## [#](<#learn-more-text>) `learn_more_text`

Attribute | Description  
---|---  
Key | `learn_more_text`  
Type | String  
Required | Optional.  
Description | The label for the hyperlink text in the help.  
Expected Output | `'API documentation'`  

* * *

## [#](<#body>) `body`

Attribute | Description  
---|---  
Key | `body`  
Type | String  
Required | Optional.  
Description | The main help text body that appears above the learn more button. This body is HTML compatible.  
Expected Output | `'<p>Build your own Chargebee action with a HTTP request. <b>The request will be authorized with your Chargebee Hana connection.</b></p>`

```

### references/sdk-reference__whitelist-removal.md

```markdown
# Workato SDK Documentation

> **Source**: https://docs.workato.com/en/developing-connectors/sdk/sdk-reference/whitelist-removal.html
> **Fetched**: 2026-01-18T02:50:39.889139

---

# [#](<#removal-of-ruby-whitelist-for-sdk>) Removal of Ruby whitelist for SDK

Following the migration of custom connector code execution to **isolated containers** , **Ruby whitelisting** is removed from the connector SDK. This change significantly expands the range of capabilities SDK developers can use within the platform. Developers can now leverage the **full functionality of Ruby 2.7** , including built-in libraries and Ruby gems available in the SDK container.

## [#](<#key-capabilities>) Key capabilities

With the removal of Ruby whitelisting, developers can now access the full functionality of Ruby 2.7, including built-in libraries and Ruby gems available in the SDK container.

  * **Access to Ruby 2.7 standard methods**

Developers now have access to the full range of Ruby 2.7 standard methods. Developers can also use Ruby’s `require` method to import built-in libraries, such as JSON, CSV, socket, and others.

  * **Pre-installed Ruby Gems**

Developers can now directly use a selection of pre-installed Ruby gems without restrictions:

    * `activesupport` (5.2.8.1)
    * `aws-sigv4` (1.2.4)
    * `charlock_holmes` (0.7.7)
    * `concurrent-ruby` (1.2.3)
    * `gyoku` (1.3.1)
    * `i18n` (0.9.5)
    * `jwt` (2.1.0)
    * `loofah` (2.21.3)
    * `mime-types` (3.5.2)
    * `nokogiri` (1.15.6)
    * `rails-html-sanitizer` (1.4.4)
    * `rest-client` (2.1.0)
    * `ruby_rncryptor` (3.0.2)
  * **TCP sockets**

Developers can now leverage TCP sockets for low-level TCP connections. [Learn more (opens new window)](<https://ruby-doc.org/stdlib-2.7.0/libdoc/socket/rdoc/TCPSocket.html>).

    * Example use case: Implement MQTP protocol over UDP or WebSocket connections.
  * **Classes and modules**

Developers can now define classes and modules, improving code reusability, organization, and maintainability.

  * **Dynamic code execution**

Using the `eval` method, developers can now dynamically load and execute code. Code can be generated on the fly based on runtime data and executed immediately.

  * **Multi-threaded and concurrent code**

Developers can now write multi-threaded and concurrent code.

## [#](<#example-connector-ideas>) Example connector ideas

  * **E-commerce data scraper**

A connector that uses `nokogiri` to scrape product data from various e-commerce websites, transforms the data using `gyoku`, and uploads it to a central database for analysis.

  * **Secure API Gateway**

A connector that uses `jwt` for secure API authentication and `rest-client` to interact with multiple third-party APIs, aggregating data and providing a unified interface.

  * **Amazon S3 file manager**

A connector that uses `aws-sigv4` to securely upload and download files from Amazon S3, with MIME type handling using `mime-types` to ensure correct file processing.

  * **HTML sanitization**

A connector that uses `loofah` and `rails-html-sanitizer` to sanitize HTML content, removing potentially harmful elements and ensuring data integrity.

  * **Real-time data processor**

A connector that uses `concurrent-ruby` to process multiple data streams in parallel, such as Internet of Things sensor data, performing real-time analysis and actions.

  * **Concurrent processing**

A connector that uses `concurrent-ruby` to handle concurrent tasks, improving the performance and responsiveness of connectors.

  * **JWT authentication**

A connector that uses the `jwt` gem to create and verify JSON web tokens for secure API authentication.

  * **XML and HTML data handling**

A connector that uses `nokogiri` and `gyoku` for parsing, transforming, and generating XML and HTML data. This can be useful for integrating with systems that use XML-based APIs or for web scraping tasks.

```

### references/guides.md

```markdown
# Workato SDK Documentation

> **Source**: https://docs.workato.com/en/developing-connectors/sdk/guides.html
> **Fetched**: 2026-01-18T02:49:20.360405

---

# [#](<#connector-how-to-guides>) Connector how-to guides

The guides in this section help you cover various parts of building a connector from authentication to building actions or triggers. Take a look at the examples to get a sensing of how you can build your connector! Here are some basics to get you started:

## [#](<#the-basics>) The basics

In Workato, we allow you to build custom connectors on our SDK using ruby (a coding language). Some basic coding knowledge in any language is recommended but we believe our SDK (Software Development Kit) has been built such that users at any level will be able to build custom connectors. The custom connectors you build can be used in any number of your recipes and you'll also able to share them with your coworkers, friends, or even the community at large.

Through out the whole process, you'll be able to build, test, and push out your custom connector directly from Workato's platform. This means working directly from the browser you have open right now and never having to install anything onto your computer. Pretty neat right?

Connector source code which you write on the SDK platform will be hosted in Workato's servers and is executed whenever a recipe using that connector is triggered. To find out more about the features of the Connector SDK console, check out our [Platform Quick Start](</developing-connectors/sdk/quickstart/quickstart.html>).

## [#](<#connector-definition-overview>) Connector definition overview

A custom connector on Workato always starts off with curly braces that encapsulates all code (Curly braces look like this `{}`). Inside the curly braces, each connector has numerous root keys that are responsible for different aspects of the connector. For example, the code `connection: { ... }` is referred to as the `connection` key. To find out more information about Connector definitions, check out our [SDK reference](</developing-connectors/sdk/sdk-reference.html>)

Take note that these key names are strictly defined and must be spelled exactly. Our framework uses these keys to know where to refer when looking to perform authorizations or execute any triggers or actions. Inside each object, there will be further nested keys that allow you to declare input fields for connections, actions, and triggers which we will cover later on.

## [#](<#sdk-cheat-sheet>) SDK cheat sheet

Read and download our [SDK cheat sheet (opens new window)](<https://public-workato-files.s3.us-east-2.amazonaws.com/Uploads/workato_connector_sdk_cheat_sheet.pdf>) to get started with the connector SDK quickly.

```