> ## Documentation Index
> Fetch the complete documentation index at: https://docs.useparagon.com/llms.txt
> Use this file to discover all available pages before exploring further.

# @Useparagon/Core Glossary

> Learn about the different types Paragon supports

## Triggers

### CronStep

Use `CronStep` to start the workflow on a periodic schedule. [Scheduler](/workflows/triggers#scheduler)

**Inputs**

| Parameter  | Type     | Description                                                                                                                                                     |
| ---------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `cron`     | string\* | The cron expression of the schedule for this trigger, from seconds to weeks. <br /> **Example**: `0 0 9 * * *` (every day at 9:00 AM)                           |
| `timezone` | string   | The timezone to use for the cron expression, expressed as an IANA timezone string. Defaults to `America/Los_Angeles`. <br /> **Example**: `Etc/Universal` (UTC) |

**Example**

```js theme={null}
/**
 * Example: Scheduler Trigger configured to run a workflow every day at 9am PST.
 */
const triggerStep = new CronStep({
  cron: '0 0 9 */1 * *',
  timeZone: 'America/Los_Angeles',
});
```

**Outputs**

The CronStep does not produce any usable output.

### EndpointStep

Use `EndpointStep` to trigger this workflow via an HTTP request. [Request](/workflows/triggers#request)

**Inputs**

| Parameter               | Type                | Description                                                                                                                                                                                                                                                  |
| ----------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `allowArbitraryPayload` | boolean\*           | If true, this Request trigger will accept any type of request. If false, this Request trigger will require `headerValidations`, `bodyValidations`, and `paramValidations` to be defined.                                                                     |
| `headerValidations`     | HeaderValidation\[] | An array of validations to use on the headers for requests to this Request trigger. This can be used to validate the presence of required headers to inbound requests. <br /> **Example**: `[{ key: "X-Tasklab-Id", required: true }]`                       |
| `bodyValidations`       | BodyValidation\[]   | An array of validations to use on body fields for requests to this Request trigger. This can be used to validate the presence or type of data in the body of inbound requests. <br /> **Example**: `[{ key: "userId", dataType: "STRING", required: true }]` |
| `paramValidations`      | ParamValidation\[]  | An array of validations to use on the URL parameters for requests to this Request trigger. This can be used to validate the presence of required parameters to inbound requests. <br /> **Example**: `[{ key: "query", required: true }]`                    |

**Example**

```js theme={null}
/**
 * Example: Request Trigger configured with parameter, header, and body validations.
 */
const triggerStep = new EndpointStep({
  allowArbitraryPayload: false,
  paramValidations: [
    {
      key: 'key',
      required: true,
    },
  ] as const,
  headerValidations: [
    {
      key: 'Content-Type',
      value: 'application-json',
    },
  ] as const,
  bodyValidations: [
    {
      key: 'email',
      dataType: 'STRING',
      required: true,
    },
    {
      key: 'first_name',
      dataType: 'STRING',
      required: true,
    },
    {
      key: 'last_name',
      dataType: 'STRING',
      required: true,
    },
  ] as const,
});
```

**Outputs**

Access the output of a Request trigger with `requestTrigger.output.request`. The below fields are fields of the `.request` property.

| Field     | Type                  | Description                                                                                                                                                                                                                                                                          |
| --------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `headers` | object                | An object of the HTTP headers received in the request. Access these properties in lowercased format, e.g. `requestTrigger.output.request.headers['content-type']`.                                                                                                                   |
| `body`    | any                   | An object or string of the HTTP body received in the request. The `body` will be an object when the Content-Type is `application/json`, `multipart/form-data`, or `application/x-www-form-urlencoded`. Otherwise, it will be attempted to be parsed as a string or File (see below). |
| `params`  | object                | An object of the URL parameters received in the request.                                                                                                                                                                                                                             |
| `file`    | FileValue / undefined | If the HTTP body refers to a file, the file contents will be available as a `FileValue` object. Otherwise, this property will resolve to `undefined`.                                                                                                                                |

### EventStep

Use `EventStep` to trigger this workflow with an [App Event](/workflows/triggers#app-events).

**Inputs**

To construct an App Event Trigger, first import your App Event into the Workflow:

```js theme={null}
import taskCreated from '../../../events/newTask';
```

Then, pass this import to the constructor of `EventStep`:

```js theme={null}
const trigger = new EventStep(taskCreated);
```

Because App Events can be shared across different workflows and integrations, they are required to be defined in the `src/events` folder of your Paragraph project.

**Example**

```js theme={null}
/**
 * Example: App Event Trigger configured with an event and object mapping.
 */
const triggerStep = new EventStep(event, {
  objectMapping: ``,
});
```

**Outputs**

Access the output of an App Event trigger with `appEventTrigger.output`. The output will match the schema of the App Event that this trigger uses.

### IntegrationEnabledStep

Use `IntegrationEnabledStep` to trigger this workflow when a user enables the integration.

**Inputs**

This trigger does not use any parameters.

**Example**

```js theme={null}
/**
 * Example: Integration Enabled Trigger with default configuration.
 */
const triggerStep = new IntegrationEnabledStep();
```

**Outputs**

The IntegrationEnabledStep does not produce any usable output.

## Steps

### ConditionalStep

A Conditional branching step to allow for control flow in Workflows.

**Inputs**

| Parameter | Type               | Description                                                                                                                                                                                                                                       |
| --------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `if`      | ConditionalInput\* | The condition to evaluate for determining whether or not to proceed into the "true" or "false" branch beneath this step. <br /> Learn more about defining ConditionalInputs: [Conditional logic](/paragraph/defining-workflows#conditional-logic) |

**Example**

```js theme={null}
/**
 * Example: Conditional Step to check if an item is in a list using operators.
 */
const itemInListStep = new ConditionalStep({
  if: Operators.Or(
    Operators.And(Operators.StringContains('["a","b","c"]', 'a')),
    Operators.And(
      Operators.StringContains('["a","b","c"]', 'c'),
      Operators.StringDoesNotContain('["a","b","c"]', 'd'),
    ),
  ),
  description: 'Item in List?',
});
```

**Outputs**

| Parameter        | Type           | Description                                                         |
| ---------------- | -------------- | ------------------------------------------------------------------- |
| `selectedChoice` | `"Yes" / "No"` | The branch that was chosen when this ConditionalStep was evaluated. |

### DelayStep

A step to pause the workflow for a fixed amount of time.

**Inputs**

| Parameter | Type                                       | Description                                                                  |
| --------- | ------------------------------------------ | ---------------------------------------------------------------------------- |
| `value`   | number\*                                   | How long to pause the workflow for, measured by the `unit` parameter.        |
| `unit`    | `"SECONDS" / "MINUTES" / "HOURS" / "DAYS"` | The unit of time to use when delaying the workflow. Defaults to `"MINUTES"`. |

**Example**

```js theme={null}
/**
 * Example: Delay Step delaying a workflow execution for 5 minutes
 */
const delayStep = new DelayStep({
  unit: 'MINUTES',
  value: 5,
  description: 'Delay workflow for 5 minutes',
 });
```

**Outputs**

The DelayStep does not produce any usable output.

### FanOutStep

A step to map over a set (array) of data in parallel, for e.g. data transformation or batch uploads.

**Inputs**

| Parameter  | Type   | Description                                   |
| ---------- | ------ | --------------------------------------------- |
| `iterator` | any\[] | A set of data to iterate over in the Fan Out. |

```js theme={null}
/**
 * Example: Fan Out step iterating through each item in an array from a previous step.
 */
const eachItemStep = new FanOutStep({
  description: 'Each Item',
  iterator: functionStep.output.result,
});
```

**Outputs**

Access one instance of a Fan Out step with `fanOutStep.output.instance`. This can only be used by steps that are in this Fan Out's branch (see: [Fan out branches](/paragraph/defining-workflows#fan-out-branches)).

| Field      | Type | Description                                                                |
| ---------- | ---- | -------------------------------------------------------------------------- |
| `instance` | any  | An item of the `iterator` property that is being processed in this branch. |

### FunctionStep

A JavaScript function step.

**Inputs**

| Parameter    | Type       | Description                                                                                                                                                                                                                                                                                                                                                                                |
| ------------ | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `code`       | Function\* | The function to run. This function must have the signature `function(parameters, libraries)` and must be *self-contained*, meaning that it cannot reference JavaScript values outside of the function body. To pass execution data through this step, use the `parameters` object. <br /> The list of `libraries` can be found in: [JavaScript Libraries](/resources/javascript-libraries) |
| `parameters` | object\*   | Parameters from other step outputs to inject into the function.                                                                                                                                                                                                                                                                                                                            |

**Example**

```js theme={null}
/**
 * Example: Function Step using IFunctionStepParameters.
 * Here the function code is provided as a string, which will be dynamically executed.
 */
const functionStepParams: IFunctionStepParameters = {
  id: 'funcStep',
  name: 'String Code Function',
  code: `
    function execute(params, libraries) {
      // Example: Reverse a given string.
      return params.input.split('').reverse().join('');
    }
    module.exports = execute;
  `,
  parameters: [{ key: 'input', value: 'reverse me' }],
  autoRetry: false,
  continueWorkflowOnError: false
};
```

**Outputs**

Access the result of an Function step with `functionStep.output.result`.

| Field    | Type | Description                                                                                                                                                                                              |
| -------- | ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `result` | any  | The return result of `code` after evaluation with `parameters`. <br /> **Note:** If `code` returns a `Promise`, the Function step will automatically await this Promise and return the unwrapped result. |

### IntegrationRequestStep

A step to send a custom request to the integration's API, without needing to provide auth details.

**Inputs**

| Parameter    | Type                                                             | Description                                                                                                                                                                                                                               |
| ------------ | ---------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `method`     | `"GET" / "POST" / "PATCH" / "PUT" / "DELETE"`\*                  | The HTTP method to use for this API request. If you select `POST`, `PUT`, or `PATCH` methods, the `body` and `bodyType` parameters will be required.                                                                                      |
| `url`        | string\*                                                         | The relative path of the API request, with respect to the base URL provided by the integration. Specifying a full URL is also supported.                                                                                                  |
| `bodyType`   | `"json" / "form-data" / "x-www-form-urlencoded" / "xml" / "raw"` | Select the type of request body that should be sent. Paragon will automatically encode the payload and set the correct `Content-Type` headers.                                                                                            |
| `body`       | object / string / `(pageToken: string) => object / string)`      | An object or string representing the request body to be sent. If using [Request Step Pagination](/workflows/requests/request-pagination), you can specify a function that returns the body of the request with respect to the Page Token. |
| `headers`    | object / `(pageToken: string) => object`                         | An object of the HTTP headers sent in the request. Integration Request Steps will automatically include the user's authentication details for the request.                                                                                |
| `params`     | object / `(pageToken: string) => object`                         | An object of the URL parameters sent in the request. Parameters can be specified either here or in the `url` property.                                                                                                                    |
| `pagination` | `(step) => PaginationOptions`                                    | If using [Request Step Pagination](/workflows/requests/request-pagination), you can define the options used in this function. Use the `step` parameter of the `pagination` function to access the output. <br /><br />                    |

`pagination` Example:

```javascript theme={null}
new IntegrationRequestStep({
  method: "GET",
  url: "/opportunities",
  params: (pageToken) => ({
    pageToken
  }),
  pagination: (step) => {
    return {
      outputPath: step.output.response.body.data,
      pageToken: step.output.response.body.nextPageToken,
      stopCondition: Operators.Or(
        Operators.And(
          Operators.DoesNotExist(step.output.response.body.nextPageToken)
        )
      )
    }
  },
});
```

**Example**

```js theme={null}
/**
 * Example: Integration Request step configured to pull contacts.
 */
const integrationRequestStep = new IntegrationRequestStep({
  autoRetry: false,
  continueWorkflowOnError: false,
  description: 'Get Contacts through API',
  method: 'GET',
  url: `/contacts?email=sean@useparagon.com`,
  params: { email: 'sean@useparagon.com' },
  headers: {},
});
```

**Outputs**

Access the output of an Integration Request step with `requestStep.output.response`.

| Field        | Type   | Description                                                    |
| ------------ | ------ | -------------------------------------------------------------- |
| `headers`    | object | An object of the HTTP headers received in the response.        |
| `body`       | any    | An object or string of the HTTP body received in the response. |
| `statusCode` | number | The HTTP status code of the response.                          |

### RequestStep

A step to send an HTTP request from a workflow.

**Inputs**

| Parameter       | Type                                                             | Description                                                                                                                                                     |
| --------------- | ---------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `method`        | `"GET" / "POST" / "PATCH" / "PUT" / "DELETE"`\*                  | The HTTP method to use for this API request. If you select `POST`, `PUT`, or `PATCH` methods, the `body` and `bodyType` parameters will be required.            |
| `url`           | string\*                                                         | The full URL of the HTTP request to send.                                                                                                                       |
| `bodyType`      | `"json" / "form-data" / "x-www-form-urlencoded" / "xml" / "raw"` | Select the type of request body that should be sent. Paragon will automatically encode the payload and set the correct `Content-Type` headers.                  |
| `body`          | object / string                                                  | An object or string representing the request body to be sent.                                                                                                   |
| `headers`       | object                                                           | An object of the HTTP headers sent in the request.                                                                                                              |
| `params`        | object                                                           | An object of the URL parameters sent in the request. Parameters can be specified either here or in the `url` property.                                          |
| `authorization` | AuthorizationConfig                                              | Choose between Basic authentication, Bearer token authentication, and OAuth 2.0 Client Credentials for handling the authorization of this request. <br /><br /> |

`authorization` Example:

```javascript theme={null}
new RequestStep({
  method: 'GET',
  url: 'https://myapp.io/api',
  authorization: {
    type: 'basic',
    username: 'paragon-user',
    password: context.getEnvironmentSecret("API_SECRET"),
  },
});
```

**Outputs**

Access the output of a Request step with `requestStep.output.response`.

| Field        | Type   | Description                                                    |
| ------------ | ------ | -------------------------------------------------------------- |
| `headers`    | object | An object of the HTTP headers received in the response.        |
| `body`       | any    | An object or string of the HTTP body received in the response. |
| `statusCode` | number | The HTTP status code of the response.                          |

**Example**

```js theme={null}
/**
 * Example: POST Request with JSON body
 */
const postRequestStepInit: IRequestStepInit = {
  id: 'step2',
  name: 'POST Request Example (JSON)',
  url: 'https://api.example.com/items',
  method: 'POST',
  bodyType: 'json',
  body: {
    item: 'newItem',
    quantity: 10,
  },
  params: { verbose: 'true' },
  headers: { 'Content-Type': 'application/json' },
  authorization: {
    type: 'bearer',
    token: 'abcdef123456',
  },
  ignoreFailure: false,
  autoRetry: false,
  continueWorkflowOnError: false
};
```

### ResponseStep

A step (*for use in Request-triggered workflows only*) to send an HTTP response from a workflow.

**Inputs**

| Parameter      | Type                   | Description                                                                                                                                               |
| -------------- | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `responseType` | `"JSON" / "FILE"`\*    | The type of Response to send to the HTTP Request that triggered the workflow. Choose between a JSON-encoded response or a raw File type.                  |
| `body`         | `object / FileValue`\* | If using a JSON `responseType`, provide an object to send in the response. If using a File `responseType`, provide a `FileValue` to send in the response. |
| `statusCode`   | `number`\*             | The status code to send in the Response to the HTTP Request that triggered the workflow.                                                                  |

**Example**

```js theme={null}
/**
 * Example: Response step returning a 201 status code with a message.
 */
const send201Step = new ResponseStep({
  description: 'Send 201',
  statusCode: 201,
  responseType: 'JSON',
  body: { message: 'Contact Created!' },
});
```
