- Core blocks - Perform actions such as requiring a manual approval on a step within a Workflow.
- Cortex blocks - Perform Cortex-based actions, such as getting Scorecard scores for an entity.
- Integration blocks - Perform third-party integration actions such as creating a new GitHub repository or creating a new incident in ServiceNow.
Prerequisites
- You must have the
Edit Workflowspermission. - An existing Workflow. If you haven’t yet created a Workflow, refer to Creating a Workflow and Configuring Workflow settings.
Every block in a Workflow must have a unique slug.
Configuring a Workflow block (basic)
- Click the + icon. The Search for blocks window opens.
- Search for and select the block you want to add to the Workflow.
- In the right pane, configure the block. Note that configuration options differ depending on the block.
- Click Save.
- Repeat Steps 1 - 4 as necessary.
Configuring a core block
Expand the tiles below for instructions on configuring each type of block.Branch
Branch
A Branch allows you to set up to five conditional paths for a Workflow.Configuring a branchHow paths workThe paths defined run sequentially. The first path that returns
See an example demonstrating how to use a Branch block in Referencing Workflow states in a block.
- In the Search for blocks window, search for Branch, then click Insert.
- In the side panel, do the following:
- Block name - Optionally, change the name of the block. The name auto-populates based on the block name.
- Slug - Optionally, change the slug. The slug auto-populates based on the block name and is made up of letters, digits, and hyphens.
- Click Add path.
- Name - Enter a name for the conditional path.
- Slug - Optionally, change the slug. The slug auto-populates based on the block name and is made up of letters, digits, and hyphens.
- Path expression - Enter the path expression (compatible with CEL syntax). The path expression does not accept dashed values; if you reference a block’s slug that contains a dash, wrap the slug in quotes and square brackets.
- For example, if you want to reference a block with the slug
slug-example, the expression would begin withactions["slug-example"]. - Autocomplete provides correctly formatted options based on the blocks defined in your Workflow.
- For example, if you want to reference a block with the slug
- Click Save.
- Click Add fallback path.
- Name - Enter a name for the fallback path.
- Slug - Optionally, change the slug. The slug auto-populates based on the block name and is made up of letters, digits, and hyphens.
- Click Save.
- Optionally, add additional paths (up to 5).
- Click Save.
To add additional blocks that occur after the paths within your branch, click + below the Branch box in the Workflow editor.
true will execute, even if subsequent paths would also return true. The Workflow will then continue performing blocks in that path. You can also set a fallback path that will run if all other paths fail.Primary and nested branches function the same way.Nested branchesTo nest a branch, you must have a conditional path defined.-
In the Workflow visual, click the + that is branched off the original branch. The Search for blocks window opens.

- Search for Branch, then click Insert.
- Follow steps 2 - 4 above in Configuring a branch.
Data transformation
Data transformation
A Data transformation performs data transformations using jq. Except for the block name and slug, the only field required is the jq expression.Configure a data transformationTo configure a data transformation:
Use cases: Manipulate or format data between steps. For example, transform user input before sending it to an API or before using it in another Workflow block.Workflow examples: See an example demonstrating how to use a Data transformation block in Referencing Workflow states in a block.
- Click Data transformation from the list of blocks.
- Enter a name.
- The slug field will automatically pre-populate based on the name you enter.
- Enter a jq expression. This field can pass any sort of jq expression, as long as the variables and context are referenced differently.
- Although you would typically use
{}to template the context of your Workflow, in this field you’ll need to reference such values as jq query values.
- Although you would typically use
- Click Save.
HTTP request
HTTP request
The HTTP request makes and records a request to a given URL, allowing you to integrate with external APIs or internal systems.For use cases requiring asynchronous operations (e.g. provisioning cloud resources or CI/CD pipelines), use the Asynchronous HTTP request block.Configuring an HTTP request
See an example demonstrating how to use an HTTP block in Scaffolding a new service with custom data based on user input.
- Search for and select the HTTP request block.
- In the side panel, configure the block metadata:
- Block name - Optionally, change the name of the block. The name auto-populates based on the block name.
- Slug - Optionally, change the slug. The slug auto-populates based on the block name and is made up of letters, digits, and hyphens.
- Integration - Select a configured integration from the dropdown to authenticate the request instead of manually building headers. See Authenticating HTTP requests with an integration for the list of supported integrations.
- The picker only lists integrations already configured for your tenant.
- An admin must turn on the integration for HTTP blocks before the block can run. If the integration is turned off, or the block uses an HTTP method or endpoint that an admin hasn’t allowed, the block shows a warning banner. You can still save the Workflow, but the block fails when it runs. See Controlling which integrations HTTP blocks can use.
- If the integration has more than one configuration, an alias picker appears so you can choose which one to use.
- If a previously selected integration is no longer configured, Cortex keeps the existing value so the block stays editable, and shows a warning that the integration is missing.
- To go back to manually configuring the full URL and headers, clear the Integration field. This also resets the alias picker.
- HTTP method - Select one of the following options from the dropdown:
DELETE,GET,PATCH,POST, orPUT(required). - URL - Enter a static URL or use a template to reference other blocks (required). If you selected an integration above, enter the URL as a relative path. Cortex automatically prepends the integration’s base URL to your request.
- When you use an integration, the path can’t leave the integration’s base URL. Cortex rejects paths that contain
.or..segments,//, backslashes, or their URL-encoded forms (such as%2e,%2F,%5C, or%25). - If you use
{{actions.url.outputs.result}}, for example, you can set the URL to the output of a JQ action. In this example:.actionsindicates a reference to a Workflow block.urlis the slug for the referenced Workflow block.outputsis the location of the actual output of the JQ expression.resultis the result field where the output is stored
- Because Mustache performs HTML escaping by default, special characters referenced in a value with two curly braces (
{{}}) will be converted to their associated HTML encoding. For example,{{=}}becomes=. To reference a non-escaped value, use three curly braces ({{{=}}}).
- When you use an integration, the path can’t leave the integration’s base URL. Cortex rejects paths that contain
- Headers - Click Add header to select one of the options provided, or enter your own.
- Include an Authorization header and use a personal access token, unless you’re authenticating with a configured integration.
- When using a secret with a header, prefix the secret with
context..
- Payload - This field only appears if you are using an HTTP request that sends a payload. The payload that you supply can also be templated and can reference an entity that the Workflow is being run with. Some additional steps are required to properly template raw JSON in the payload field:
- Single primitive values work as expected. To add JSON objects or arrays, create a Data transformation block that accesses the relevant JSON and pipes it into the
tojsonbuilt-in.- For example,
.context.initiatedBy | tojsonenables a user to add the fullinitiatedByobject()into an HTTP request payload. When templating this value, three curly braces are needed in order to reference a non-escaped value. In this example, if the Data transformation block has the slugtransform-to-json, then the payload would include{{{actions.transform-to-json.outputs.result}}}.
- For example,
- Single primitive values work as expected. To add JSON objects or arrays, create a Data transformation block that accesses the relevant JSON and pipes it into the
- Click Save.
HTTP action (async)
HTTP action (async)
The Asynchronous HTTP request makes and records a request to a given URL. This block pauses execution until a callback API is invoked or a timeout occurs, enabling long-running Workflows.Configuring an Asynchronous HTTP requestSet
You can pass the callback URL to the external service by using the template variable
{{callbackUrl}}. This can be passed as part of the URL, in a header, or in the payload.For example, when passing the variable in a URL, it would look like the following format: https://example.com/?url={{callbackUrl}}.Always use exactly two curly braces for {{callbackUrl}}. Cortex replaces this exact text when the block runs, so {{{callbackUrl}}} produces a broken URL.- Search for and select the Asynchronous HTTP request block.
- In the side panel, configure the block metadata:
- Block name - Optionally, change the name of the block. The name auto-populates based on the block name.
- Slug - Optionally, change the slug. The slug auto-populates based on the block name and is made up of letters, digits, and hyphens.
- Integration - Select a configured integration from the dropdown to authenticate the request instead of manually building headers. See Authenticating HTTP requests with an integration for the list of supported integrations.
- The picker only lists integrations already configured for your tenant.
- An admin must turn on the integration for HTTP blocks before the block can run. If the integration is turned off, or the block uses an HTTP method or endpoint that an admin hasn’t allowed, the block shows a warning banner. You can still save the Workflow, but the block fails when it runs. See Controlling which integrations HTTP blocks can use.
- If the integration has more than one configuration, an alias picker appears so you can choose which one to use.
- If a previously selected integration is no longer configured, Cortex keeps the existing value so the block stays editable, and shows a warning that the integration is missing.
- To go back to manually configuring the full URL and headers, clear the Integration field. This also resets the alias picker.
- HTTP method - Select one of the following options from the dropdown:
DELETE,GET,PATCH,POST, orPUT(required). - URL - Enter a static URL or use a template to reference other blocks (required). If you selected an integration above, enter the URL as a relative path. Cortex automatically prepends the integration’s base URL to your request.
- When you use an integration, the path can’t leave the integration’s base URL. Cortex rejects paths that contain
.or..segments,//, backslashes, or their URL-encoded forms (such as%2e,%2F,%5C, or%25). - If you use
{{actions.url.outputs.result}}, for example, you can set the URL to the output of a JQ action. In this example:.actionsindicates a reference to a Workflow block.urlis the slug for the referenced Workflow block.outputsis the location of the actual output of the JQ expression.resultis the result field where the output is stored
- Because Mustache performs HTML escaping by default, special characters referenced in a value with two curly braces (
{{}}) will be converted to their associated HTML encoding. For example,{{=}}becomes=. To reference a non-escaped value, use three curly braces ({{{=}}}).
- When you use an integration, the path can’t leave the integration’s base URL. Cortex rejects paths that contain
- Headers - Click Add header to select one of the options provided, or enter your own.
- Include an Authorization header and use a personal access token, unless you’re authenticating with a configured integration.
- When using a secret with a header, prefix the secret with
context..
- Payload - This field only appears if you are using an HTTP request that sends a payload. The payload that you supply can also be templated and can reference an entity that the Workflow is being run with. Some additional steps are required to properly template raw JSON in the payload field:
- Single primitive values work as expected. To add JSON objects or arrays, create a Data transformation block that accesses the relevant JSON and pipes it into the
tojsonbuilt-in.- For example,
.context.initiatedBy | tojsonenables a user to add the fullinitiatedByobject()into an HTTP request payload. When templating this value, three curly braces are needed in order to reference a non-escaped value. In this example, if the Data transformation block has the slugtransform-to-json, then the payload would include{{{actions.transform-to-json.outputs.result}}}.
- For example,
- Single primitive values work as expected. To add JSON objects or arrays, create a Data transformation block that accesses the relevant JSON and pipes it into the
- Timeout - Configure a timeout for this action. The maximum is 30 days and the minimum is 1 minute.
- After a timeout, the block fails with the status
timed_out. If you have notifications enabled, you’ll receive a notification if you initiate a Workflow and it times out.
- After a timeout, the block fails with the status
- Click Save.
- Use the
POSTmethod - Include a valid Cortex API key in the
Authorizationheader (Bearer <token>) - Match the expected request body shape. Below is an example:
status to one of the following values:SUCCESS- The external work finished. The block completes and the Workflow continues.FAILURE- The external work failed. The block fails.UPDATE- The external work is still in progress. The block keeps waiting for another callback, and Cortex records themessageandresponseas progress.
JavaScript
JavaScript
Use a JavaScript block to insert custom code or add looping and other logic to your Workflows.The JavaScript runtime supports the ES2020 specification and has an implementation of Fetch API, allowing you to make HTTP requests directly in the script rather than needing to add an additional HTTP request block to your Workflow.To test your block’s code locally, you can use Cortex’s JavaScript harness.Configuring a JavaScript block
See an example demonstrating how to use a JavaScript block: Looping in a JavaScript block and returning a specified output
- In the Search for blocks window, search for JavaScript, then click Insert.
- In the side panel, do the following:
- Block name - Optionally, change the name of the block. The name auto-populates based on the block name.
- Slug - Optionally, change the slug. The slug auto-populates based on the block name and is made up of letters, digits, and hyphens.
- JavaScript - Enter the script you want to run. The script must end with a
returnstatement. The value from thereturnstatement is exposed viaoutputs.result.- For example, in the script
return {"a": 1, "b": 2}, the result can be referenced from subsequent blocks asactions.<SLUG>.outputs.result, and the value ofaasactions.<SLUG>.outputs.result.a. - You can reference previous blocks and run context by accessing
actionsandcontext. For example,actions["jq"].outputs.result. - Learn more about referencing blocks and Workflow states here.
- For example, in the script
- Click Save.
throw statement. For example:Manual approval
Manual approval
A manual approval pauses the Workflow to get approval from a member of a given Team. Like with user inputs, the Workflow proceeds to the next block once it has been approved.Configuring a manual approval
This section displays any blocks that are pending your approval. If manual approval actions exist within a Workflow, but do not require your approval, they will not appear here, even if you are designated to approve a different block in the same Workflow.You can open any Workflow in the pending approval list to Approve or Reject the block.Once all of your approval requests have been approved or rejected, this tab will disappear from the Workflows page.
- In the Search for blocks window, search for Manual approval, then click Insert.
- In the side panel, do the following:
- Block name - Optionally, change the name of the block. The name auto-populates based on the block name.
- Slug - Optionally, change the slug. The slug auto-populates based on the block name and is made up of letters, digits, and hyphens.
- From the Teams allowed to approve dropdown, select one or more teams who are allowed to approve the request from this block. Any member of a given team can approve the block.
-
To resolve the approving team dynamically instead of picking a fixed team, click the icon next to the field (Use value from previous step). The field switches to a text box where you can enter the path to a value from earlier in the Workflow. Start typing to see available paths, then select one, for example
actions.user-input.outputs.team-name. Cortex resolves this path each time the Workflow runs, so the block can route approval to a different team depending on the inputs or entity involved in that run.

-
Enter the path on its own, without template syntax. Use
actions.action-slug.outputs.field-name, not{{actions.action-slug.outputs.field-name}}. - Click the icon again to switch back to selecting a fixed team.
-
To resolve the approving team dynamically instead of picking a fixed team, click the icon next to the field (Use value from previous step). The field switches to a text box where you can enter the path to a value from earlier in the Workflow. Start typing to see available paths, then select one, for example
- Context for approvers - Optionally, enter a message to be displayed to approvers to help them make a decision. This message supports Mustache templating.
- Timeout - Optionally, enter the callback timeout. This value can be from one (1) minute to 30 days. The default value is 30 days.
- Click Save.

Run Workflow
Run Workflow
The Run workflow block calls another Workflow from inside the current one, letting you chain Workflows together. You can pass values into the child Workflow’s variables, and you can have the block wait for the child Workflow to finish so later blocks can use its result.To configure a Run Workflow block:
The embedded Workflow and the parent Workflow have a strict parent‑child relationship to prevent accidental Workflow looping.
- In the Search for blocks window, search for Run workflow from the list of blocks.
- Under Block name, enter a name. The slug field auto‑populates based on the name.
- From the Workflow drop‑down menu, select the Workflow to run.
- Optionally, from the Entity drop‑down menu, select an entity to run the target Workflow against. If the target Workflow is entity‑scoped and no entity is provided, it pauses for input at runtime.
- Optionally, toggle on Wait for completion to pause this block until the child Workflow run finishes. See Waiting for the child Workflow below.
- When the toggle is on, you can set a Timeout from 1 minute to 30 days. When the timeout expires, the child Workflow run is cancelled. Without a timeout, the block waits until the child run finishes.
- Under Inputs, optionally enter a value for each of the child Workflow’s variables. See Passing inputs to the child Workflow below.
- Click Save.
- Enter a fixed value, or a template that references earlier blocks or the run context, such as
{{actions.form.outputs.appId}}. - The child Workflow reads each value as
{{variables.<variable-slug>}}, the same way it reads a variable set throughinitialContextwhen the Workflow is run via the API. - Values keep the variable’s type. For example,
5entered for a Number variable is passed as a number, and123entered for a String variable stays text. - Leave a field empty to use the variable’s default value.
- If you select a different Workflow, the inputs are cleared.
actions.<block-slug>.outputs.runId.When Wait for completion is on, the parent Workflow pauses at this block until the child run ends. While it waits, the parent’s run details show the child Workflow run. When the child finishes, later blocks can reference the following outputs:actions.<block-slug>.outputs.runId- The child Workflow’s run ID.actions.<block-slug>.outputs.status- The final status of the child Workflow run.actions.<block-slug>.outputs.runResponse- The child Workflow’s run response.actions.<block-slug>.outputs.variables- The child Workflow’s variables when the run ended, keyed by the child’s variable slugs. For example,actions.<block-slug>.outputs.variables.approved.
- If the child run fails, times out, or is cancelled, the Run Workflow block fails.
- If the parent run ends before the child finishes (for example, it’s cancelled or rejected, or another block fails or times out), Cortex cancels the child run. This keeps approvals in the child Workflow from staying open.
Use case: Reuse one shared approval Workflow across many parent Workflows. Each parent passes its own details into the child’s variables, waits for the child to finish, then uses
actions.<block-slug>.outputs.variables in a Branch block to decide what happens next.Scaffolder
Scaffolder
The Scaffolder uses a Cortex Scaffolder template to perform a given function. You must have the To configure a Scaffolder:
Execute Scaffolder permission to configure a Scaffolder block.See the docs to learn about registering a Scaffolder template.Use cases: Standardize and bootstrap service creationWorkflow example: See an example demonstrating how to use a Scaffolder block in Scaffolding a new service with custom data based on user input.
- Click Scaffolder from the list of blocks.
- Enter a name.
- The slug field will automatically pre-populate based on the name you enter.
- Under Scaffolder template, select a template from the dropdown.
- This dropdown pulls in all templates available from the Scaffolder page.
- Configure the remaining fields. The fields differ depending on the template’s specifications and available Git providers. The option to create a repo also may or may not be visible, depending on whether the template requires a pull request.
- Click Save.
- In the bottom of the block configuration, click Add variable.
- In the override variable modal, click the Variable dropdown to select the Scaffolder template fields to override. Note that the options in this dropdown will be pulled from fields in the Scaffolder template you selected in the first step.

- Under Path, enter the path to the actual value we want in the Workflow.
- For example, if you wanted to override the Project name variable for a Scaffolder with the tag of the entity you’re running, the path would be
context.entity.tag— that will obtain and supply the value.
- For example, if you wanted to override the Project name variable for a Scaffolder with the tag of the entity you’re running, the path would be
- If you want to override the options that are available to a user running the Workflow, toggle on Is value override.
- For example, if you wanted to restrict the project name to some set of values based on a particular HTTP fetch, you would toggle this setting on.
- When toggled on, the value being grabbed in lieu of
project_nameis the value of the variable. When toggled off, the value grabbed would be the option provided for that variable, i.e. the project name.
User input
User input
The User input block pauses the Workflow and prompts the user for specific inputs. Once inputs are entered, the Workflow proceeds to the next block.To configure a user input block:The validation logic runs when you submit your response to the user input, flagging any issues immediately. With the example above, errors appear if the 
Use cases: Collect new developer details (name, email, GitHub username) during onboarding, or gather IAM policy requirements before creating a policy in AWS.Workflow example: Onboard a new developer > Collect user information in User input block > Subsequent actions use this data to create accounts and send notifications.See examples demonstrating how to use a User Input block in Looping in a JavaScript block and returning specified output and Scaffolding a new service with custom data based on user input.
- In the Workflow, click the User input block.
- In the User input side panel, do the following:
- Under Block name, enter a name for the block.
- The Slug field automatically pre-populates based on the block name.
-
Click Add user input.

- In the Add input side panel, do the following:
- Under Name, enter a name for the input field (required).
- The Key field automatically pre-populates based on the name (required). This must be unique across fields in a given user input block.
- Under Description, enter a description of the input field.
- You can use templating to reference previous block outputs in the description. For example, if a previous step creates a Pull Request and outputs the URL of the PR, you might want to reference it in the description of a subsequent user input step using a template:
Confirm that you have merged the Pull Request created here: {{ actions.<block-slug>.outputs.response.gitURL }}
- You can use templating to reference previous block outputs in the description. For example, if a previous step creates a Pull Request and outputs the URL of the PR, you might want to reference it in the description of a subsequent user input step using a template:
- From the Type drop-down menu, select an input type:
- Date - Date in
YYYY-MM-DDformat. If you select this option, configure the fields that appear:- Date format - Select Date or Date and time
- Default value - Enter the default date value
- Number - A numerical value. If you select this option, configure the fields that appear:
- Number format - Select Integer or Decimal
- Minimum value - Set the minimum number value
- Maximum value - Set the maximum number value
- Paragraph - Multi-line, freeform text
- Secret - Capture a secret value
- Select - Manually configured or predefined data selection. If you select this option, configure the fields that appear:
- Data source - Select one of the following:
- Cortex entity - Filter which entities users can select. If you don’t set filters, all entities are available. You can set filters under the Filtering options section. Optionally, toggle on the following:
- Allow multiple - If enabled, multiple selections are accepted.
- Limit to workflow runner’s entities - If enabled, the user running the Workflow will only see their owned entities as options during this user input step.
- To only show teams the user belongs to, enable this toggle and select
teamfrom the Entity type drop-down menu.
- To only show teams the user belongs to, enable this toggle and select
- Cortex user - Filter by teams and users to set the available options. Without filters, all Cortex users and teams are available. You can set filters under the Filtering options section. Optionally, toggle on the following:
- Allow multiple - If enabled, multiple selections are accepted.
- Manual - Manually define each option for the input. You can select any of these defined options as the default value. Optionally, toggle on Allow multiple to allow multiple selections.
- Click Add option to add values and labels. If a label is not defined, the value is used as the label.
- Slack channels - Choose to include or exclude one or more Slack channels from the available options. The default values include all Slack channels registered in Cortex. Optionally, toggle on Allow multiple to allow multiple selections.
- Select the channels you want to include from the Slack channels drop-down menu.
- Cortex entity - Filter which entities users can select. If you don’t set filters, all entities are available. You can set filters under the Filtering options section. Optionally, toggle on the following:
- Data source - Select one of the following:
- Text - Short, freeform text
- Toggle - Boolean value
- Nested form - Users can enter data multiple times for the inputs you configure. If you select this option, configure the fields that appear. See Additional steps for the ‘Nested form’ type below for more information.
- Data type - Select one of the following:
- Object (default) - Each item is a structured record made up of the sub-fields you define below. Use this when every entry needs more than one property, such as a list of database instances that each have a name and a size.
- Single value - Each item is a single value of one type. Use this to collect a simple list, such as admin emails, allowed IP addresses, or port numbers. When you select Single value, configure the Value type that appears:
- Text - A single line of text
- Paragraph - Multi-line, freeform text
- Number - A numeric value. Choose Integer (whole numbers) or Decimal (allows decimals), and optionally set a minimum and maximum value.
- Toggle - A true or false value
- Date - A date in YYYY-MM-DD format
- Set the number of elements - Toggle on to to let the user add or remove entries when running the Workflow. Set a minimum and maximum count; the minimum also serves as the default number of elements.
- Data type - Select one of the following:
- Date - Date in
- Depending on the input type you selected in the previous step, you may need to configure the following:
- Under Placeholder, enter text to display when a field is empty.
- Under Default value, enter a value that automatically populates the field.
- Under Validation regex, set validation options for the input field. If you chose the secret type, enter the secret value needed to run this action.
- Under Path to override value, enter the previous block output path to override the value of a given input.
- For example, if the key is
name, enteringactions.name-action.outputs.namein the previous block output path field will use the output from a previous step as the name.
- For example, if the key is
- Optionally, toggle on Is override value editable. If enabled, users can edit the override value before continuing to execute the Workflow.
- Click Add input. After clicking Add input, you’re directed back to the User input side panel.
- Optionally, toggle on Validation logic. See Adding validation logic below for more information.
- Click Save.
Object), while an allow‑list form might collect a flat list of email addresses (String).Cortex supports up to 5 layers of nesting in Object nested forms using the Nested form input. String nested forms cannot be nested further, as each row is a leaf string.‘Nested form’ type output:- When the data type is Single value, the block output is a flat JSON array of the chosen type, referenced as
actions.<slug>.outputs.<key>. For example,["jenny", "luis"]for Text or[8080, 8443]for an Integer. - When the data type is Object, the output is an array of objects, for example
[{ "name": "db-1", "size": 100 }, { "name": "db-2", "size": 200 }].
- In the User input side panel, toggle on Validation logic.
- Enter a JavaScript expression.
- Call
validator.addInputViolationto display an error on a specific input, andvalidator.addGlobalViolationto display an error at the top of the form.- If you call
validator.addInputViolationwith an invalid input key, an error displays at the top of the form.
- If you call
- Call
ser role and target date inputs, and a global error if any field is invalid:user role value is under three characters or the target date is not in the future.
Set variable(s)
Set variable(s)
This block allows you to set or update specific variables during a Workflow. The variables must be declared in the Workflow’s basic settings.To configure a Set variable(s) block:
- Click Set variable(s) from the list of blocks.
- Enter a slug for the block.
- The slug field will automatically pre-populate based on the name you enter.
- In the Variable dropdown, select the variable you want to set/update.
- Define how you want to set the variable’s value. You can use a direct reference or use JavaScript.
- Optionally, set additional variables.
- Click Save.
Authenticating HTTP requests with an integration
In the HTTP request and Asynchronous HTTP request blocks, you can authenticate a request with an integration that’s already configured in your Cortex workspace. You don’t need to build an Authorization header yourself. Cortex uses the integration’s credentials and prepends its base URL to the relative path you enter in the URL field. The Integration dropdown only shows integrations that are configured in your workspace. Before a block can run with an integration, an admin must also turn that integration on for HTTP blocks. See Controlling which integrations HTTP blocks can use. You can authenticate HTTP requests with the following integrations:Expand to see a list of supported integrations
Expand to see a list of supported integrations
- Apiiro
- Azure DevOps
- BambooHR
- Bitbucket
- BugSnag
- Buildkite
- CircleCI
- ClickUp
- Codecov
- Coralogix
- Cortex
- FireHydrant
- GitHub
- GitLab
- Google Cloud
- Harness
- Instana
- Jenkins
- Jira
- LaunchDarkly
- Mend
- New Relic
- Opsgenie
- PagerDuty
- Prometheus
- Rollbar
- Rootly
- Semgrep
- Sentry
- ServiceNow
- ServiceNow Cloud Observability (Lightstep)
- Slack
- Snyk
- SonarQube
- Splunk Observability Cloud (SignalFx)
- Splunk On-Call (VictorOps)
- Sumo Logic
- xMatters
The block authenticates with the integration’s API token, so it has the same permissions as that token. Check the token’s scopes before you let Workflow editors call an integration’s API. To limit what HTTP blocks can do with an integration, see Controlling which integrations HTTP blocks can use.
Controlling which integrations HTTP blocks can use
Admins control which integrations HTTP blocks can authenticate with, which actions they can take, and which API endpoints they can’t call. Cortex checks these settings each time an HTTP request or Asynchronous HTTP request block runs, before it fetches the integration’s credentials or sends the request. Prerequisites- You must have the
Edit Settingspermission. - The integration must be configured in your Cortex workspace.
- An integration that hasn’t been turned on is off, so new integrations start off.
- Workspaces created before these settings were added have the following integrations turned on: Azure DevOps, Bitbucket, Cortex, GitHub, GitLab, Google Cloud, Harness, Jenkins, LaunchDarkly, PagerDuty, ServiceNow, and Slack. Turn on any other integration before you use it in an HTTP block.
- When an integration is turned on, all actions are allowed and no endpoints are blocked.
Turning integrations on or off
- From the main sidebar, click your avatar in the bottom-left corner.
- Click Settings.
- From the Settings menu, expand Workflows, then select HTTP block.

- The page lists every supported integration in alphabetical order. Integrations that aren’t installed in your workspace are locked. Click Install next to one to set it up.
- To hide integrations you haven’t installed, select Show only installed.
- Use the toggle next to an integration to turn it on or off for HTTP blocks.
<Integration> integration is disabled for HTTP blocks. Integrations can be enabled in settings.”
Limiting allowed actions
By default, HTTP blocks can send any HTTP method to an integration that’s turned on. To limit them, for example to read-only access:- On the HTTP block settings page, click Configure next to an integration that’s turned on.
- In the side panel, under Allowed actions, toggle each action on or off:
- Create -
POSTrequests - Read -
GETrequests - Update -
PUTandPATCHrequests - Delete -
DELETErequests
- Create -
- Click Save.
Blocking specific endpoints
Block a single endpoint when an action is fine in general but one call is hard to undo, such as deleting a Scorecard.- On the HTTP block settings page, click Configure next to an integration that’s turned on.
- In the side panel, under Blocked endpoints, click Add rule.
- Do the following::
- Select a method from the dropdown.
- Enter the path to block, starting with
/. Use a placeholder such as{tag}for a variable part of the path, for example/api/v1/scorecards/{tag}. The path can’t contain?or... - Optionally, select the Include sub-paths checkbox to also block every path under the one you entered.
- Optionally, but highly recommended, explain why the endpoint is blocked. Cortex shows the reason when a run is blocked.
- Click Add rule.
- Optionally, use Test a request to check whether a method and path would be blocked or allowed.
- Click Save.
Configuring an integration block
Prerequisites- Ensure the integration is installed in your Cortex workspace.
- Ensure the integration is configured with the correct permissions. Refer to Integrations for more information.
If an integration supports multiple configurations, you’ll be prompted to select the configuration alias to use with the block. The block authenticates using the selected configuration, so ensure that you select the configuration with the appropriate permissions.
AWS
AWS
- Attach role policy
- Create EC2 security group
- Create IAM group
- Create IAM role
- Create S3 bucket
- Describe EC2 instances
- List buckets
- Put role policy
- Run EC2 instances
Azure DevOps
Azure DevOps
- Create a branch
- Create branch policies
- Create file
- Create repository
- Delete a branch
- Delete branch policy
- Delete file
- Delete repository
- Fetch latest commit ID
- Get a branch
- Get all branches
- Get branch policy
- Get file
- Get pipeline
- Get pipeline run details
- Get repository
- List branch policies
- List pipeline runs
- List pipelines
- List repositories
- Rename a branch
- Run pipeline
- Update branch policies
- Update file
Bitbucket
Bitbucket
- Create repository
- Get file
- Update branch protection
GitHub
GitHub
- Add label to pull request
- Add user to org
- Add user to team
- Create a branch
- Create deployment
- Create or update custom property values
- Create or update a file
- Create a pull request
- Create a pull request comment
- Create reference (or branch)
- Create release
- Create repository
- Create team
- Delete a branch
- Delete branch protection rules
- Delete file
- Delete team
- Find files
- Get a branch
- Get branch protection rules
- Get commit
- Get deployment
- Get file
- Get release by tag
- Get team
- Get team membership
- List branches
- List commits
- List deployments
- List organization members
- List releases
- List repositories
- List team members
- List teams
- Merge a branch
- Remove user from organization
- Remove user from team
- Rename a branch
- Trigger workflow (see additional note below)
- Update branch protection rules
- Update repository
response output includes fields that identify the triggered run:workflow_run_id- The ID of the GitHub Actions run that was triggered.run_url- The GitHub API URL for the run.html_url- The link to the run in the GitHub UI.
{{actions.<block-slug>.outputs.response.workflow_run_id}}. This is useful for monitoring the triggered run, such as polling the GitHub API from a JavaScript block until the run completes before the Cortex Workflow continues.Some GitHub instances, such as older GitHub Enterprise Server versions, don’t return run details when a workflow is dispatched. In that case the block still succeeds, but response and its run detail fields are null.GitLab
GitLab
- Archive project
- Create approval rule
- Create branch protection
- Create file
- Create pipeline schedule
- Create project
- Create project access token
- Create project variable
- Create push rule
- Delete approval rule
- Delete branch protection
- Delete file
- Delete pipeline schedule
- Delete project
- Delete project variable
- Delete push rule
- Get approval configuration
- Get approval rule
- Get file
- Get pipeline schedule
- Get project
- Get project variable Get protected branch
- Get push rule
- List approval rules
- List pipeline schedules
- List project access tokens
- List project variables
- List protected branches
- Revoke project access token
- Rotate project access token
- Run pipeline
- Unarchive project
- Update approval configuration
- Update approval rule
- Update branch protection
- Update file
- Update pipeline schedule
- Update project
- Update project variable
Google Cloud
Google Cloud
- Create project
- Delete project
- Get project
- List projects
- Update project
Harness
Harness
- Execute pipeline
execution_id- The identifier of the Harness pipeline execution that was started.status- The execution status Harness reported at trigger time.response- The full response object from Harness.
incident.io
incident.io
- Create incident
- Entity tag (required) - The tag of the Cortex entity to associate with the incident.
- Name (required) - The name of the incident.
- Summary (optional) - Additional information about the incident.
- Severity (required) - The name of an incident.io severity, e.g.
Minor. - Status (optional) - The name of an incident.io status. Leave it empty to use your incident.io default status.
- Incident type (optional) - The name of an incident.io incident type. Leave it empty to use your incident.io default incident type.
- Mode (optional) - The incident mode: Standard, Retrospective, Test, or Tutorial. Defaults to Standard.
Create incidents scope. See Configuring incident.io.Jenkins
Jenkins
- Run a build
- Run a build with parameters
LaunchDarkly
LaunchDarkly
- Create a feature flag
- Delete a feature flag
- Get feature flag
- List feature flags
- List projects
- Toggle feature flags
- Update a feature flag
Microsoft Teams
Microsoft Teams
- Send message
PagerDuty
PagerDuty
- Create escalation policy
- Create incident
- Create schedule
- Create service
- Create team
- Delete escalation policy
- Delete schedule
- Delete service
- Delete team
- Get escalation policy
- Get schedule
- Get service
- Get team
- List escalation policies
- List incidents
- List schedules
- List services
- List teams
- List users
- Schedule override
- Update escalation policy
- Update schedule
- Update service
- Update team
ServiceNow
ServiceNow
- Create incident
- Create record
- Delete incident
- Delete record
- Get incident
- Get record
- Get user by email
- Get user information
- List groups
- List incident categories
- List incident subcategories
- List incidents
- List records
- List users
- Update record
Slack
Slack
- Get channel info
- Get user by email
- List channels
- List members in channel
- List users
- Send message
- Ensure the Cortex AI assistant is added to the appropriate Slack channel.
- If the AI assistant isn’t in the channel, you’ll receive the following error:
Cannot send message to Slack channel without invitation. To resolve the error, do one of the following:- Invite the AI assistant to the specific channel OR
- Reinstall the Slack integration to get the latest scopes, which allows posting to public channels without the AI assistant needing to be a member
- If the AI assistant isn’t in the channel, you’ll receive the following error:
- Ensure the AI assistant has the correct permission(s) scoped:
- If the channel is public and the install is up to date (has
chat:write.public), the bot can post without being a member. - If the channel is private, the bot needs
chat:writeand must be invited to the channel.
- If the channel is public and the install is up to date (has
- Click the + icon. The Search for blocks window opens.
- Search for the block you want to add to the Workflow.
- Select a block to view its details, including any permissions required for it to run correctly.
- Click Configure. The block is inserted into your Workflow, and a configuration form appears in the side panel.
-
In the side panel, configure the block metadata:
- Block name - Optionally, change the name of the block. The name auto-populates based on the block name.
- Slug - Optionally, change the slug. The slug auto-populates based on the block name and is made up of letters, digits, and hyphens.
{{ ... }}). For fields that aren’t text-based, click the path icon on the right of the input to switch into templating mode.
- Click Save.
Duplicating a block
There may be an instance where you want to repeat a task within your Workflow. Follow the steps below to duplicate a block.- Locate the block you want to duplicate.
-
Click the Overflow icon on the right side of the block.

- Click Duplicate block. A copy of the block is placed in the Workflow.
- Optionally, hover over the block and use the grip icon to drag it to a new position in the Workflow.