# Overview

AirOps use cases and AI content workflows: an all-in-one platform for AI search visibility, content refresh, content creation, and detecting content decay across LLMs, replacing multiple point tools.

Welcome to AirOps. We're excited you're here!

AirOps powers your content strategy, creation, and performance, helping your brand get seen, cited, and celebrated across AI and traditional search. As an all-in-one platform, AirOps brings together your SEO, AI search, and analytics data, replacing multiple point tools, so you can see what's working and take action through structured, AI-powered content workflows: Playbooks, Grids, and human-in-the-loop content creation.

Here are examples of popular AirOps use cases and AI content workflows:

* **Content Refresh & Optimization**: Automatically analyze and update existing content across your CMS using real-time SEO data, competitive insights, and AI-powered recommendations. Surface opportunities on your owned content, external sites, and community discussions on a regular cadence.
* **Content Creation**: Publish quality, brand-accurate content at velocity. Combine human expertise with precise AI, drawing from internal experts, systems, and knowledge to tell stories only your brand can tell.
* **AI Search Insights**: Track how your brand appears across AI answer engines like ChatGPT, Gemini, Perplexity, and Google AI Overviews. Monitor mention rates, citation patterns, and competitive positioning, and automatically detect content decay and visibility drops across LLMs, to optimize your visibility in AI-powered search.
* **Content Strategy & Research**: Build data-driven content strategies by leveraging AI analysis of search trends, competitor content, and market opportunities. Generate targeted content briefs and outlines backed by comprehensive research.

***

## The AirOps Platform

Campaigns organize priorities and measured outcomes. Use Actions to create and update content, Insights to understand performance, and Context to keep outputs grounded in your brand.

### Inbox

Use [Inbox](/inbox) to review Playbook and Workflow outputs that need attention, including Human Review checkpoints and Brand Kit Refresh proposals.

### Campaigns

Turn priorities into content work and measured outcomes. Campaigns connect opportunity generation, Action, and Measurement so your team can see what to create, refresh, review, publish, and adjust.

[Learn about Campaigns](/campaigns)

### Actions

Take action on insights to craft content that drives pipeline.

| Area                                    | Description                                                                                                                |
| --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| [Playbooks](/actions/playbooks)         | Build agentic content processes with natural-language instructions, tools, context, artifacts, triggers, and human review. |
| [Workflows](/actions/workflow-concepts) | Create lower-level automation with explicit steps, branching, data processing, and integrations.                           |
| [Grids](/actions/grids)                 | Run Playbooks and Workflows across many rows, collaborate on outputs, and publish at scale.                                |

### Insights

Know where you stand and what to prioritize across AI and traditional search.

| Area                                     | Description                                                                |
| ---------------------------------------- | -------------------------------------------------------------------------- |
| [Analytics](/insights/analytics)         | Review Overview, Visibility, Citations, Sentiment, and custom Dashboards.  |
| [Onsite](/insights/onsite)               | Understand your Pages, AI crawler and agent activity, and Content Updates. |
| [Offsite](/insights/offsite)             | Analyze cited sources and the communities influencing AI answers.          |
| [Paid](/insights/paid)                   | Review paid campaign performance alongside AI search data.                 |
| [Prompts](/insights/prompts)             | Manage tracked prompts and review recommended prompts.                     |
| [Opportunities](/insights/opportunities) | Find recommended areas where your team can improve visibility.             |

### Context

Connect your brand knowledge to keep every output accurate and on-brand.

| Area                                      | Description                                                                             |
| ----------------------------------------- | --------------------------------------------------------------------------------------- |
| [Brand Kits](/context/brand-kit)          | Define your brand's voice, rules, audiences, products, regions, and visual guidelines.  |
| [Knowledge Bases](/context/memory-stores) | Give Playbooks and Workflows access to proprietary files, websites, and connected data. |


# Getting Started

Learn the AirOps fundamentals and build your first Playbook or Workflow.

Learn how AirOps organizes content work, then build your first Playbook or Workflow. Start with Core Concepts if you are new to AirOps.

## Learn the fundamentals

[Core Concepts](/getting-started/core-concepts) explains how Insights, Actions, and Context work together across AirOps.

## Build with AirOps

### Create a Playbook

Playbooks are the best starting point for most content creation, refresh, and optimization work. Follow [Building your first Playbook](/getting-started/building-your-first-playbook) to create and run one.

### Create a Workflow

Workflows let you configure each Step and control how data moves through a process. Follow [Building your first Workflow](/getting-started/building-your-first-workflow) to create one in the Workflow Studio.

## Get support

Review [AirOps Support](/getting-started/airops-support) for available support plans and channels.


# Core Concepts

Core concepts of AirOps, the AI content platform for answer engine optimization (AEO) and SEO: Insights, Actions, and Context, with structured, full-funnel content workflows.

AirOps is an AI content platform for answer engine optimization (AEO) and SEO. It is organized into three core pillars that work together to help you understand your content landscape, take action on opportunities, and power everything with your brand context.

***

## Insights

**Know where you stand and what to prioritize across AI and traditional search.**

Insights is your command center for understanding how your brand performs across search engines and AI platforms. It surfaces what's working, what's not, and where the opportunities are.

### Analytics

Analytics tracks your brand's visibility and competitive positioning across AI search platforms. Its Overview, Visibility, Citations, Sentiment, and Dashboards tabs help you move from headline performance to focused analysis and reporting.

[Learn more about Analytics →](/insights/analytics)

### Onsite

Onsite connects information about your owned pages:

* **Pages** combines traditional search and AI search performance for your content inventory.
* **Agent Analytics** shows how AI crawlers and assistants access your site.
* **Content Updates** records when pages are published or refreshed.

[Learn more about Onsite →](/insights/onsite)

### Offsite

Offsite shows which external domains, URLs, and communities influence AI answers. Use Citations to identify influential sources and Community to understand which Reddit discussions are being referenced.

[Learn more about Offsite →](/insights/offsite)

### Prompts

Prompts shows you the questions and queries driving visibility in your space across AI platforms. Understand what users are asking, how AI is answering, and where your brand shows up (or doesn't).

[Learn more about Prompts →](/insights/prompts)

### Opportunities

Opportunities turns performance and competitive signals into recommended areas for creation, refresh, outreach, and community work.

[Learn more about Opportunities →](/insights/opportunities)

***

## Actions

**Take action on insights to craft content that drives pipeline.**

Actions is where insights become reality through structured, full-funnel content workflows. Start with Playbooks for most content creation, refresh, and optimization work. Use Grids to run Playbooks at scale, and use Workflows when you need the lower-level visual builder or an existing workflow pattern.

### Playbooks

Playbooks are the preferred action surface for turning insights into content work. Build from natural-language instructions that combine:

* Sections and instructions
* Tools, Inputs, Artifacts, and Triggers
* Human Review checkpoints
* Direct publishing and integration steps

Use Playbooks when you want an editable, reviewable content agent that can create, refresh, optimize, or monitor content with your brand context.

[Build your first Playbook ->](/getting-started/building-your-first-playbook)

[Learn more about Playbooks ->](/actions/playbooks)

### Grid

Grid is your content command center: a spreadsheet-like interface designed for running Playbooks and workflows at scale and collaborating as a team. Import content from your CMS, run Playbooks across hundreds of rows, review outputs side-by-side, and publish directly back to your systems. In short, use Grid to run Playbooks across many pages at scale, and use Workflows for lower-level, step-by-step automation.

[Learn more about Grid ->](/actions/grids/create-a-grid)

### Workflows

Workflows are the visual automation builder in AirOps. Use them when you need step-by-step data processing, branching logic, or existing workflow automation that combines:

* Multiple AI models and data sources
* Web research and SEO tools
* Human review and approval steps
* Direct publishing to your CMS

Workflows can be as simple as a single AI prompt or as complex as a multi-step pipeline with branching logic and quality checks.

[Learn more about Workflows →](/actions/workflow-concepts)

### Power Agents

Power Agents are pre-built agentic automations created by the AirOps team. They handle common content tasks like:

* SERP analysis and keyword research
* Content brief creation
* Article generation and optimization
* Competitive gap analysis

Fork any Power Agent to customize it for your specific needs, or use them as-is to get started quickly.

[Learn more about Power Agents →](/actions/workflow-concepts/power-agents)

***

## Context

**Connect your brand knowledge, data sources, and tools for accurate, on-brand content.**

Context ensures everything you create in AirOps is grounded in your brand's voice, informed by your proprietary data, and connected to your existing tools.

### Brand Kits

Brand Kits capture your brand's identity and make it available to every Playbook and workflow. Define your:

* **Foundations**: Voice, tone, style guidelines, and rules
* **Product Lines**: Products, services, and their attributes
* **Content Types**: Templates and structures for different content formats
* **Audiences**: Target personas and their characteristics
* **Regions**: Geographic and language variations

[Learn more about Brand Kits →](/context/brand-kit)

### Knowledge Bases

Knowledge Bases store your proprietary information and make it searchable by AI. Upload documents, scrape websites, or connect databases to give your Playbooks and workflows access to:

* Internal documentation and guides
* Product information and specifications
* Historical content and research
* Customer data and insights

[Learn more about Knowledge Bases →](/context/memory-stores)

### Integrations

Integrations connect AirOps to your existing tech stack. Publish directly to your CMS, pull data from SEO tools, sync with project management apps, and more:

* **CMS**: Webflow, WordPress, Contentful, Sanity, Ghost, and more
* **SEO Tools**: Moz, DataForSEO, Google Search Console
* **Project Management**: Notion, Airtable, Asana, Monday.com, Google Sheets
* **Communication**: Slack, Gmail
* **Social**: YouTube, Reddit

[Learn more about Integrations →](/integrations/overview)


# Building your first Playbook

Create and run your first AirOps Playbook

In this tutorial, you will build a content creation Playbook. The Playbook takes a primary keyword or target prompt, researches LLM search responses from AirOps Insights and Google results, creates an outline, drafts the article, adds links, and produces a final Markdown article.

Use this tutorial when you are new to AirOps Actions. Playbooks are the best starting point for most content creation, refresh, and optimization work.

## Before you start

For the highest-quality output, configure the two context sources this Playbook depends on:

* **AirOps Insights:** Track the prompts, topics, competitors, and pages you care about. The Playbook uses AirOps Insights to research LLM search responses, citations in those responses, and AEO opportunities for the target prompt.
* **Brand Kit:** Keep your Brand Kit current so the Playbook can use your positioning, audience, voice, writing rules, product lines, and competitor context.

## What you will build

The Playbook will:

1. Accept a primary keyword, target prompt, and Brand Kit as Inputs.
2. Research LLM search responses from AirOps Insights and compare them with Google results.
3. Analyze competitor content and content gaps.
4. Create an outline, draft, link map, and final article.
5. Pause for Human Review before the final article is approved.

## Step 1: Create a blank Playbook

1. Click **Create**.
2. Select **Playbook**.
3. Select **Blank Playbook**.
4. Name the Playbook **Blog Creation**.

AirOps opens the Playbook editor. The editor has a header chip row for Tools, Inputs, Artifacts, and **Add Trigger**, plus top-right actions for **Run Playbook**, **Publish**, and **Run History**.

## Step 2: Add Inputs

Create the Inputs the Playbook needs at run time.

| Input name        | Type      | Description                                                              |
| ----------------- | --------- | ------------------------------------------------------------------------ |
| `primary_keyword` | Text      | The SEO keyword the article should target.                               |
| `target_prompt`   | Text      | The LLM search prompt or question the article should help answer.        |
| `brand_kit`       | Brand Kit | The Brand Kit that should guide positioning, audience, voice, and rules. |

The Playbook should work when either `primary_keyword` or `target_prompt` is provided. If both are provided, use both to shape research and article strategy.

## Step 3: Add Tools

Type `/` in any Section to open the slash menu. Use it to insert Tools, Inputs, Artifacts, and other references directly into the Playbook instructions.

For this tutorial, add the Tools your workspace has connected:

* **Google Search:** Find current Google results for the target keyword.
* **Parallel Web Systems:** Use the Parallel Search API, Parallel Extract API, and Parallel Task API to research the web, extract source content, and structure findings.
* **AirOps SEO Research:** Pull keyword, domain, and SEO context.
* **DataForSEO**, **Moz**, or **Google Search Console:** Add SEO data if your workspace uses these sources.
* **Page 360 Report:** Diagnose one owned URL across search performance, AI visibility, freshness, authority signals, and page content.
* **Page Versus Report:** Compare one owned URL against the pages winning in search and AI answers, then surface gaps to close.
* **Web Page Scrape:** Read specific pages the Playbook needs to inspect.
* **Brandfetch:** Enrich company or brand details when needed.

{% hint style="info" %}
You do not need every Tool for the first version. Start with Google Search, Parallel Web Systems, AirOps SEO Research, and whichever AirOps page reports are relevant to the article.
{% endhint %}

## Step 4: Declare Artifacts

Artifacts are the durable outputs the Playbook produces. Add these Artifacts before writing the Sections so you can reference them by name.

| Artifact                    | Type     | Purpose                                                                                         |
| --------------------------- | -------- | ----------------------------------------------------------------------------------------------- |
| **AI & Google Results.md**  | Markdown | Captures existing content, top Google results, and LLM response citations from AirOps Insights. |
| **Competitive Analysis.md** | Markdown | Summarizes search intent, competitor structure, keywords, FAQs, gaps, and AEO fit.              |
| **Topic Research.md**       | Markdown | Stores verified facts, expert insights, examples, and claim corrections.                        |
| **Content Outline.md**      | Markdown | Defines the article structure and writing brief.                                                |
| **Article Draft.md**        | Markdown | Stores the first full article draft.                                                            |
| **Link Map.json**           | JSON     | Maps internal and external links to article sections.                                           |
| **Final Article.md**        | Markdown | Stores the finished article with links.                                                         |

Use the slash menu to insert Artifact references into later Sections. Reference Artifacts by name, not by the generated filename from a Session.

## Step 5: Write the Sections

Use Sections to describe the work in phases. Keep the first version focused on the main path.

Format each Section with a short **Objective**, the Inputs or Artifacts it should reference, clear **Instructions**, and the expected **Output** Artifact. Use the slash menu to insert Inputs, Artifacts, Tools, and Brand Kit references instead of typing their names manually.

### Section A: Research LLM responses and Google results

Tell the Playbook to:

* Check the brand site for existing content related to the keyword or prompt.
* Use AirOps Insights to research LLM search responses and citations for the target prompt.
* Use Google Search and SEO tools to collect top Google results for the primary keyword.
* Exclude social, forums, and competitor domains when possible.
* Write the findings to **AI & Google Results.md**.

### Section B: Analyze competitors and gaps

Tell the Playbook to:

* Extract headings, body content, word count, and FAQ sections from the strongest cited and ranking pages.
* Analyze search intent, topic coverage, structure, keywords, FAQs, and gaps.
* Use the Brand Kit to identify angles the brand can credibly own.
* Write the analysis to **Competitive Analysis.md**.

### Section C: Gather topic research

Tell the Playbook to:

* Build a research agenda from **Competitive Analysis.md**.
* Find current statistics, expert perspectives, real-world examples, and outdated competitor claims.
* Prefer primary and authoritative sources.
* Write the findings to **Topic Research.md**.

### Section D: Create the outline

Tell the Playbook to:

* Use **Competitive Analysis.md**, **Topic Research.md**, and the Brand Kit to define the article strategy.
* Include the H1, H2s, H3s, target word count, key points, keywords, research notes, reader questions, and brand angle.
* Write the outline to **Content Outline.md**.

### Section E: Draft and review the article

Tell the Playbook to:

* Draft the article from **Content Outline.md**.
* Use **Topic Research.md** for facts, examples, and sources.
* Follow Brand Kit voice, audience, writing rules, and content type conventions.
* Write the draft to **Article Draft.md**.
* Pause for Human Review before finalizing.

### Section F: Add links and finalize

Tell the Playbook to:

* Add relevant internal links from the brand site.
* Add external links that support specific claims.
* Write the link plan to **Link Map.json**.
* Write the finished article to **Final Article.md**.

## Step 6: Run and publish

1. Click **Run Playbook**.
2. Enter a primary keyword, target prompt, or both.
3. Select the Brand Kit.
4. Review each Artifact as it is created.
5. Complete the Human Review step from the Inbox or Session view.
6. Confirm that **Final Article.md** is complete.
7. Click **Publish** when the Playbook structure works reliably.

Published Playbooks can run from Grids and Triggers. Use a [Webhook Trigger](/actions/playbooks/triggers) when an external system should start a Playbook programmatically. Draft edits remain editable, but downstream runs use a published version.

## Next steps

After publishing, you can:

* Add the Playbook to a Grid to create articles across many keywords or prompts.
* Add a Schedule, Webhook, or Monitor Trigger.
* Use [Quill](/quill) to revise the Playbook from natural-language instructions.
* Build a separate publishing flow for CMS updates.

{% hint style="info" %}
Best practice is to keep content creation and CMS publishing separate. Run the content Playbook first, review the output, then publish through a Grid column, a separate publishing Playbook, or a CMS MCP. If a Playbook or CMS MCP publishes or refreshes a page, use the AirOps MCP `track_aeo_page_content_update` tool with the page URL and update type so AirOps Insights can connect future performance changes to that content update.
{% endhint %}

Congratulations, you have built and run your first content creation Playbook.

This walkthrough follows the same general structure as the **Blog Creation** template. Run the template with the same keyword, target prompt, and Brand Kit if you want to compare outputs and see how a more complete version handles the same brief.

For deeper reference, see [Create a Playbook](/actions/playbooks/create-a-playbook), [Build a Playbook](/actions/playbooks/build-a-playbook), and [Run a Playbook](/actions/playbooks/run-a-playbook).


# Building your first Workflow

<figure><img src="/files/kJK0tHTVpJ0CRq2GHlgG" alt=""><figcaption></figcaption></figure>

## Building your first Workflow: Keyword SERP Researcher

In this tutorial, we'll walk through building your first AirOps Workflow - a Keyword SERP Researcher that analyzes Google search results for your target keywords.

## Interactive Tutorial

{% @arcade/embed url="<https://app.arcade.software/share/emHfbSG0PcdSrIcWVTGN>" flowId="emHfbSG0PcdSrIcWVTGN" %}

## Step-by-Step Guide

### Creating the Workflow

#### Step 1: Create a New Workflow

1. From the Home screen, click the "Create" button in the top-right corner
2. Select "Workflow" from the dropdown menu
3. You'll be directed to the AirOps Workflow Studio where you'll build your workflow

<figure><img src="/files/Ghj5iFWHiFCfNnifwgwq" alt="" width="362"><figcaption></figcaption></figure>

#### Step 2: Configure Your Workflow Input

1. In the Workflow Studio, you'll see a node labeled "Set Inputs" at the top of your workflow
2. Click on this node to configure your input field
3. Click "Add field to group" or a similar option
4. Select "Short Text" as the input type
5. Label the field "keyword" - this will be the search term you want to analyze
6. Make sure the variable name is also "keyword" (this happens automatically)
7. Toggle "Required" to ensure a keyword is always provided
8. Save your configuration

<figure><img src="/files/HeRPIS9btlZ78JBECdS2" alt="" width="375"><figcaption></figcaption></figure>

### Setting Up the Google Search Step

#### Step 1: Add a Google Search Step

1. You'll need to add a Google Search step after your inputs
2. Look for the "+" button or "Add Step" option below your input node
3. Navigate through the categories and select "Web Research" category
4. Choose "Google Search" from the available steps
5. This will add a Google Search step to your workflow, similar to what's shown in Image 2

#### Step 2: Configure the Google Search Step

1. Click on the Google Search step
2. In the "Search Query" field, click on the variable explorer (pink icon on the top right of the input field) and choose `{{ keyword }}`
3. Leave the "Search Parameters" field empty for now
4. Save your configuration

<figure><img src="/files/pVIKf9Tpt3g8l2zE6ccj" alt="" width="375"><figcaption></figcaption></figure>

### Creating the LLM Analysis Step

#### Step 1: Add a Prompt LLM Step

1. After your Google Search step, add another step
2. Choose "Prompt LLM" (Large Language Model) from the available steps
3. This will add an LLM step after your Google Search step

#### Step 2: Configure the LLM Model

1. Click on the LLM step
2. We're using "GPT-4o" as our model in this example
3. You can leave other settings at their defaults for now

<figure><img src="/files/OHnxOw5zUxaOg6Sfc1do" alt="" width="375"><figcaption></figcaption></figure>

#### Step 3: Craft Your LLM Prompt

1. In the LLM step panel, enter the following prompt in the input field that says "User" on its left:

{% code overflow="wrap" %}

```
You are tasked with analyzing the themes and best practices of top-performing Google search results for a given keyword. This analysis will help understand what makes these pages successful and provide insights for content creation.

The keyword for analysis is:
{{ keyword }}

Here are the top-performing results from Google for this keyword:
{{ step_1.output }}

To complete this task, follow these steps:

1. Carefully read through all the top-performing results.

2. Analyze the themes:
   a. Identify common topics or subjects addressed across multiple results.
   b. Note any unique angles or perspectives on the main topic.
   c. Observe the depth and breadth of information covered.

3. Identify best practices:
   a. Examine the content structure (headings, subheadings, lists, etc.).
   b. Assess the use of media (images, videos, infographics, etc.).
   c. Evaluate the writing style and tone.
   d. Look for patterns in content length and detail level.
   e. Note any common external resources or references used.
   f. Observe how the content addresses user intent.

4. Present your analysis in the following format:

# Analysis
## Themes
[List and briefly describe 3-5 main themes you've identified]


## Best Practices
[List and explain 5-7 best practices you've observed]

## Recommendations
[Provide 3-5 actionable recommendations for creating content based on your analysis]

Remember to be thorough in your analysis and objective in your observations. Focus on patterns and practices that appear to contribute to the success of these top-performing pages. Your insights should be valuable for anyone looking to create high-quality content on this topic.
```

{% endcode %}

2. Notice how this prompt references both the keyword input (`{{ keyword }}`) and the output from the previous Google Search step (`{{ step_1.output }}`)

### Testing and Publishing Your Workflow

#### Step 1: Test Your Workflow

1. Click "Test Workflow" in the top right of the Studio navigation bar (play icon next to it)
2. Enter a test keyword (e.g., "content marketing tips" or "best running shoes")
3. Click "Test Workflow" to run your workflow
4. Review the results to ensure both steps are working correctly

#### Step 2: Publish Your Workflow

1. Once you're satisfied with the results, look for a "Publish" button on the top right of the Studio
2. Give your workflow a descriptive name like "Keyword SERP Researcher"
3. Add a brief description of what the workflow does
4. Publish your workflow to make it available for running

<figure><img src="/files/2gkmNnzKvyeVQwOo1XZ1" alt="" width="375"><figcaption></figcaption></figure>

### You did it :tada:

Congratulations! You've successfully built your first AirOps Workflow. This Keyword SERP Researcher provides insights for your content creation strategy by analyzing what makes top-ranking content successful for any keyword.

As you become more familiar with AirOps, you can expand this workflow by adding more steps, incorporating human review steps, or connecting it to other workflows to create a comprehensive content creation pipeline.


# AirOps Support

AirOps offers two levels of support: General and Premium.  Each is available across several channels, depending on how quickly you need an answer and what you're working on.

### Support Plans <a href="#h_3852335487" id="h_3852335487"></a>

#### General Support

General Support is available to all AirOps customers and is the best starting point for most questions. You can reach the team through email or in app chat, where you can get help with account questions, troubleshooting, and billing questions, etc.  This is right path when you need a reliable answer but aren't continuously working against a tight deadline.

#### Premium Support

AirOps offers Premium Support as an add-on to your software plan.  Premium Support is designed for faster, higher-touch help and includes the following features: &#x20;

* Access to a dedicated slack channel for your team in the AirOps workspace with direct access to the Support team. &#x20;
* A faster response time for all active channels and additional prioritization if the issue needs to be escalated to the engineering team.
* Training session for your team, scoped to your business processes, use cases, and builder maturity.
* A quarterly product usage report on adoption, usage, support themes and recommended next actions to better leverage the AirOps platform.

### Support Channels <a href="#h_3852335487" id="h_3852335487"></a>

AirOps offers four channels to reach the team, depending on your plan and on how quickly you need an answer with what you're working on: live chat inside the app, email, and the AirOps Builders Slack community and AirOps Slack (Premium Support only).

#### Live chat in the AirOps platform <a href="#h_3852335487" id="h_3852335487"></a>

The fastest way to reach support is through the live chat widget built directly into the AirOps app. To access this chat you'll need to click on "More" on the bottom-left corner of the app at [app.airops.com](https://app.airops.com/) and then click on '💬 **Live Chat**'.

* Our average initial response time for live chat is 10 minutes, so this channel is best for high urgency cases when you need immediate assistance.

<figure><img src="/files/h7tj2Rlyn22jL0vdDQcL" alt=""><figcaption></figcaption></figure>

#### Email <a href="#h_a493251126" id="h_a493251126"></a>

Our team can also be reached at <support@airops.com>.  This email address can be used for support questions, technical issues, or general inquiries about your account. This is also the right address to use if you need to report something related to security or compliance.

* Email is a good option when you don't need an immediate reply, or when your question involves details that are easier to lay out in writing (screenshots, logs, multiple workflow IDs, etc.).
* Emails to this address are routed the same way as live chat conversations, so you'll get the same quality of support
* If your question touches on a security or compliance matter, using this email directly (rather than live chat) ensures it's routed appropriately from the start.

#### AirOps Builders Slack community <a href="#h_75189b20ad" id="h_75189b20ad"></a>

The AirOps Builders Slack is a community workspace for people building on AirOps to connect with each other and with the AirOps team.

* This is best suited for builders who want to go deeper on use cases, share what they're building, ask "how would you approach this" style questions, and learn from other AirOps users. This channel is not to be used for account-specific or urgent support issues.
* Because it's a shared community space, treat it as a place for broader product discussion rather than a substitute for live chat or email when something in your account is broken or urgent.

#### AirOps Slack <a href="#h_75189b20ad" id="h_75189b20ad"></a>

For Premium Support customers, they have access to a dedicated slack channel with the AirOps team.  This channel gives you closer access to the AirOps team, the ability to have product suggestions and feedback shared more quickly to the internal team, and a space to organize and collaborate your internal team with the AirOps Support team.

### Support FAQs

#### What are AirOps' support hours? <a href="#h_bd3883940e" id="h_bd3883940e"></a>

AirOps support is available 24/7 via both our dedciated team and our AirOps Support Agent.  Outside of our staffed business hours, 7am to 5pm EST, our AirOps Support Agent will triage and help with all inquiries. &#x20;

#### Is there any way to prioritize my support request? <a href="#h_1fed3f837d" id="h_1fed3f837d"></a>

If you contact support outside of 7am to 5pm EST, whether through live chat, email, or the Builders Slack, your message is still received. It will be triaged by our internal AirOps Support Agent and if the issue is unable to be resolved it will be escalated and answered as soon as the team is back online.

#### How do I join the AirOps Builders Community? <a href="#h_1fed3f837d" id="h_1fed3f837d"></a>

Interested in learning how to use AirOps to build your use cases? Join our [AirOps Builders Slack channel](https://join.slack.com/t/airopsbuilders/shared_invite/zt-26pxgdmvk-dyn3pCdJ4E5YGv1zVRkh2Q) to connect with us further!


# Quill

Use Quill, the AirOps agent captain, to work across Insights, Brand Kits, Playbooks, and workspace context.

Quill is the AirOps agent captain. Use Quill to move from insight to action across AirOps: ask questions about the page you are viewing, reference workspace context, and build or revise Playbooks.

Quill works best when you give it a clear goal, the relevant context, and permission to make the change you want. When Quill changes a Playbook or Brand Kit, review the result before publishing or running it at scale.

## What Quill can help with

Quill can help you:

* Answer questions about your current AirOps page.
* Review Insights data and identify where to act next.
* Use Brand Kit context when planning content or updating instructions.
* Create, edit, and improve Playbooks from natural-language prompts.
* Manage Playbook Inputs, Artifacts, Tools, references, and Triggers.
* Search AirOps docs when you ask platform questions.
* Use file, image, PDF, and text attachments as part of a request.

Quill does not replace review for high-impact changes. Publish a Playbook only after you have reviewed the draft and confirmed the setup.

## How to use Quill

1. Open a page in AirOps where Quill is available.
2. Click the green Quill button in the lower-right corner.
3. Ask a question or describe the change you want.
4. Add references with `/` when you want Quill to use a specific Brand Kit, Playbook, Prompt, Page, or Citation.
5. Attach files with the paperclip button when Quill should use source material.
6. Review Quill's answer or the draft changes it made.
7. Publish, run, or continue editing only after the output matches your goal.

On an empty Playbook, Quill may open automatically so you can describe what you want to build.

Quill is available on most workspace pages. It does not appear in account settings, usage, trash, the Workflow editor, or agent chat.

## Page context and references

Quill receives context about the page where you send each message. For example, if you message Quill from a Playbook editor, it can use that Playbook as the target. If you message Quill from a Brand Kit, Grid, Knowledge Base, Workflow, Folder, Inbox, or Insights page, it can use that page context to answer more precisely.

Use `/` in the chat box to add explicit references. References help Quill focus on the exact resource you mean, especially when a workspace has multiple Brand Kits, Playbooks, tracked Pages, Prompts, or Citations.

{% hint style="info" %}
Quill uses the page context from the moment you send the message. If you navigate to a different page during the same chat, send a new message from that page so Quill receives the updated context.
{% endhint %}

## Attachments

Use attachments when Quill needs source material that is not already in AirOps. Quill accepts up to five files per message. Each file can be up to 10 MB.

Supported attachment types include:

* JPG, JPEG, PNG, GIF, and WebP images
* PDF files
* TXT and Markdown files
* JSON files
* HTML files
* CSV files

Quill can also use a screenshot of your current page when screenshot capture is enabled for your workspace.

## Chat controls

Use the Quill header controls to manage the conversation:

| Control               | Use for                                                          |
| --------------------- | ---------------------------------------------------------------- |
| **History**           | Reopen a previous Quill conversation.                            |
| **New chat**          | Start a new conversation without prior chat context.             |
| **Enter full screen** | Expand Quill when you need more space.                           |
| **Minimize**          | Close the panel while keeping Quill available from the launcher. |
| **Stop generating**   | Stop Quill while it is responding.                               |

## Examples

Use direct instructions like:

* "Create a Playbook to refresh pages with declining citations."
* "Explain what this Playbook does and suggest improvements."
* "Use this Brand Kit and outline a content refresh strategy."
* "Compare these citations and tell me which pages need updates."

When asking Quill to change a Playbook, include the outcome, source context, and any constraints in one message. For example:

```
Revise this Playbook so it refreshes blog posts with declining AI citations. Keep the existing Brand Kit Input, add a research section that checks current SERP and citation data, and add a Human Review checkpoint before any CMS update.
```


# Inbox

Review AirOps work that needs your attention

Inbox is the workspace-level queue for work that needs your attention. It brings pending Playbook reviews and Brand Kit proposals into one place.

## What appears in Inbox

Inbox can include:

* [Playbook](/actions/playbooks) Sessions waiting at a Human Review checkpoint
* [Brand Kit Refresh](/context/brand-kit/refresh) proposals that are ready to review

## Review an item

1. Open **Inbox**.
2. Select an item to see its source and review context.
3. Review or edit the output.
4. Complete the available action to continue or close the item.

For a record of every run, including runs that do not need review, use [Run History](/your-workspace/monitoring/run-history). For Workflow-specific review configuration, see [Human Review](/actions/workflow-concepts/workflow-steps/flow/human-review).


# Campaigns

Use Campaigns to measure the impact of your AI search work

Campaigns are how AirOps measures the impact of your AI search work.

Use a Campaign when you want one place for the objective, the recommended actions, the work that ships, and the signals that tell you whether the effort is working.

## What a Campaign is

A Campaign is the end-to-end effort to impact your AI search performance. It brings the strategy, work, and measurement for that effort into one place.

* **Objective:** The outcome you want to improve.
* **Scope:** The Brand Kit, topics, and folders or prompt tags the Campaign should evaluate.
* **Opportunities:** Recommended actions with a brief and supporting context.
* **Action:** The accepted work your team creates, refreshes, reviews, or publishes.
* **Measurement:** The performance signals that show whether the work changed visibility, citations, sentiment, traffic, or share of voice.

## How teams use Campaigns

Use Campaigns to manage content work from priority through measurement. A Campaign helps your team:

* Start with a priority from Insights, such as a visibility gap, citation issue, sentiment theme, or traffic trend.
* Turn that priority into opportunities for pages or prompts.
* Move accepted opportunities into **Action** for creation, refresh, review, and publishing.
* Keep the work tied to the same objective from strategy through execution.
* Measure what changed after the work ships.

## Campaign tabs

| Tab               | Use it to                                                                           |
| ----------------- | ----------------------------------------------------------------------------------- |
| **Opportunities** | Review recommended actions, add opportunities manually, and accept or decline work. |
| **Action**        | Run accepted work in a Grid-style workspace.                                        |
| **Measurement**   | Track page performance, visibility, and sentiment for accepted work.                |

For common questions about Campaign versions, Opportunities, Action, and Measurement, see the [Campaigns FAQ](/campaigns/faq).

## What teams learn

Campaigns help your team decide where to invest more effort, where to double-check the work, and where to cut back. Use Measurement to find:

* Actions that improved AI visibility, citations, sentiment, traffic, or share of voice.
* Work that needs another review because the expected signal did not move.
* Efforts that should be narrowed, paused, or stopped.
* Patterns your team can use to shape the next round of opportunities.


# Create a Campaign

Create a Campaign with Quill, a template, or a recommended Strategy Brief

A strong Campaign starts with clear answers to three questions: what should improve, which topics and content should be in scope, and what action should happen when an opportunity is found.

## Ways to create a Campaign

Create Campaigns with Quill. Common starting points:

* **Ask Quill from context:** Use Quill when you are already looking at the priority you want to act on. For example, ask Quill to create a Campaign from an AI visibility gap, a sentiment theme, a page group, or a prompt set.
* **Create from Campaigns:** Open **Campaigns** and click **Create**. Choose **Create blank** to describe the Campaign in Quill, or **Create from template** to start from a kickoff prompt.
* **Start from a recommended Campaign:** If recommended Campaigns appear on the workspace home page, open a card to review the **Strategy Brief**, then click **Build Campaign**.

Each path creates a draft Campaign. Review the draft before publishing so the Brand Kit, action type, scope, opportunity guidance, and tools match the work your team wants to run.

## What a Campaign is made of

| Component                  | What to define                                                                                                            |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| **Name**                   | A short label for the effort.                                                                                             |
| **Brand Kit**              | The brand context Quill should use. The Brand Kit must have AI Visibility set up before you can publish.                  |
| **Action type**            | Whether the Campaign should find opportunities for existing content or new content.                                       |
| **Generate opportunities** | Guidance that tells AirOps what to prioritize, avoid, or include. This appears as **Opportunity Criteria** after publish. |
| **Topics**                 | The topics that guide opportunity generation and measurement.                                                             |
| **Folder**                 | For existing-content Campaigns, the site folders AirOps should evaluate.                                                  |
| **Prompt tags**            | For new-content Campaigns, the prompt tags AirOps should evaluate.                                                        |
| **Tools**                  | The tools the strategy should use when finding opportunities.                                                             |
| **Trigger**                | An optional cadence or event that generates new opportunities after publish.                                              |
| **Measurement**            | The signals your team uses after accepted work lands in **Action**.                                                       |

## How to configure

1. Start from Quill, open **Campaigns** and click **Create**, or open a recommended Campaign.
2. If you started from a Strategy Brief, review the hypothesis, brief, action type, folder, topics, Brand Kit, and 90-day target. Click **Build Campaign** when you want Quill to create the draft.
3. Review the draft Campaign setup.
4. Select a **Brand Kit** that already has AI Visibility. If the Brand Kit still needs setup, click through to Insights setup first.
5. Choose an **Action type**:
   * Existing content, such as a page refresh
   * New content, such as page creation
6. Add guidance under **Generate opportunities**. Tell AirOps what to prioritize, exclude, or rank higher.
7. Set **Topics**.
8. Set scope:
   * For existing-content Campaigns, choose **Folder** values.
   * For new-content Campaigns, choose **Prompt tags**.
9. Choose the **Tools** the strategy should use, if you can edit the strategy Playbook.
10. Click **Publish Campaign**.
11. After publish, add a **Trigger** if the Campaign should generate opportunities on a recurring cadence.
12. Click **Generate Opportunities**, or add an opportunity manually from Campaign configuration.

{% hint style="info" %}
Opportunity generation usually takes 15 to 30 minutes. AirOps can notify you in Inbox or Slack when the run finishes.
{% endhint %}

{% hint style="warning" %}
Confirm the Campaign setup before publishing. After a Campaign is published, you can still generate opportunities, add opportunities manually, and manage triggers. Brand Kit, action type, opportunity criteria, topics, and folder or prompt-tag scope stay locked.
{% endhint %}

## Publish requirements

You can publish when the draft has:

* A Brand Kit with AI Visibility
* An action type
* Finished topic and folder or prompt-tag configuration
* Permission to publish Campaigns

Quill must also finish any in-progress setup step before **Publish Campaign** is available.

## Opportunity criteria

Opportunity criteria help AirOps decide what is worth surfacing. Use them for priority rules, exclusions, quality thresholds, and ranking guidance.

Strong criteria:

* Prioritize pages with declining citation rate, slipping organic performance, outdated product details, or missing coverage for prompts where competitors are cited.
* Exclude pages refreshed recently.
* Focus on prompts tied to high-intent topics, launch themes, or important personas.
* Prioritize sentiment themes where owned content could change how the brand is described.

Avoid using opportunity criteria as a full content brief. The Campaign should identify the right opportunities. Your team can edit the brief and supporting context during review, then complete the work in **Action**.

## Examples

### Refresh pages losing AI visibility

Use this Campaign when you want to find existing pages that should be updated because their AI search performance is slipping.

1. Ask Quill to create a page refresh Campaign for the target Brand Kit, or start from a recommended refresh Campaign.
2. Choose the existing-content action type.
3. Set **Folder** to the section of the site you want to monitor, such as `/blog`.
4. Set **Topics** to the topic area you want to improve.
5. Add opportunity guidance:

```
Prioritize pages with declining citation rate, slipping organic performance, outdated product details, or missing coverage for prompts where competitors are cited. Exclude pages that were refreshed recently.
```

6. Publish the Campaign.
7. Add a trigger if the Campaign should check for new opportunities on a recurring cadence.

### Create pages for uncovered prompts

Use this Campaign when tracked prompts show a gap and no owned page answers the question well.

1. Ask Quill to create a Campaign from the prompt set, or open **Campaigns** and click **Create**.
2. Choose the new-content action type.
3. Select the Brand Kit and the relevant **Topics** or **Prompt tags**.
4. Add opportunity guidance:

```
Find prompts that are asked often but have no dedicated owned page. Prioritize high-intent topics where competitor pages are cited and our existing Pricing or FAQ pages only cover part of the answer.
```

5. Publish the Campaign.


# Opportunities

Review Campaign opportunities, edit the brief, and choose supporting context

**Opportunities** is the Campaign tab where your team reviews recommended actions. Each opportunity is one proposed action with a brief and optional supporting pages or prompts. Review that brief before work moves into **Action**.

## Review flow

1. Open the Campaign.
2. Select **Opportunities**.
3. Generate opportunities. Click **Generate Opportunities** to run Quill, wait for a configured **Trigger**, or click **Add opportunity manually**.
4. Wait for generation to finish. This usually takes 15 to 30 minutes.
5. Review the opportunities shown in the list. Open **View Details** on an opportunity to read its brief, target page, and supporting context.
6. Edit the brief if the recommended action needs a clearer instruction.
7. If the opportunity has supporting context, continue to **Review context**. Keep the pages or prompts that belong with the action. Remove any that should not be included.
8. Click **Accept opportunity** to send the work to **Action**, or **Decline opportunity** to leave it out.

## Opportunity groups

| Group                 | What it contains                                                |
| --------------------- | --------------------------------------------------------------- |
| **New Opportunities** | Pending recommendations your team has not accepted or declined. |
| **Accepted**          | Opportunities already sent to **Action**.                       |
| **Declined**          | Opportunities your team chose not to pursue.                    |

Use **Show All** when a group has more opportunities than the first page.

## What you review

Open **View Details** to review the full brief and context.

| Field           | Description                                                                                |
| --------------- | ------------------------------------------------------------------------------------------ |
| **Brief**       | The recommended action. You can edit this before you accept.                               |
| **Target page** | For refresh Campaigns, the existing page the action should update.                         |
| **Context**     | Supporting pages or prompts that should inform the action and later appear in Measurement. |
| **Status**      | New, accepted, or declined.                                                                |

## Review the brief and context

Accepting an opportunity is a parent-level decision. You accept or decline the recommended action, then choose which supporting context to carry into **Action**.

1. Read the opportunity name and brief.
2. Edit the brief if the action should be more specific.
3. Click **Next** when there is supporting context to review.
4. Keep the prompts or pages that belong with the action.
5. Click **Remove** on any context you do not want included. You can add a removed item back with **Include**.
6. Click **Accept opportunity**.

Included context is used when your team takes action and when Measurement calculates visibility and sentiment. Removed context is not copied into the Action row.

{% hint style="info" %}
You can still open accepted or declined opportunities to read the original recommendation. Those records are no longer editable.
{% endhint %}

## Add an opportunity manually

Use **Add opportunity manually** when you already know the action and do not want to wait for a generation run.

1. Open Campaign configuration.
2. Click **Add opportunity manually**.
3. For a refresh Campaign, select the **Page** the opportunity should update.
4. Add **Reference context** such as related prompts or pages. This context is tied to the opportunity and tracked in Measurement.
5. Write the **Brief**.
6. Click **Add Opportunity**. Select **Add more** if you want to stay in the modal and create another one.

## Opportunity JSON shape

The following simplified shape describes a v2 Campaign Opportunity. It is the recommendation your team reviews before accepting it into **Action**.

A v2 Opportunity object contains these fields:

| Field                        | Shape             | Purpose                                                                                 |
| ---------------------------- | ----------------- | --------------------------------------------------------------------------------------- |
| `id`                         | Integer           | The Opportunity ID.                                                                     |
| `name`                       | String            | The name of the recommended action.                                                     |
| `description`                | String            | The recommended brief. You can edit it during review.                                   |
| `opportunity_schema_version` | Integer           | The Opportunity contract version. V2 is `2`.                                            |
| `status`                     | String            | The review status, such as `pending`, `accepted`, or `rejected`.                        |
| `target_page`                | Object or `null`  | The page to refresh. It is `null` for a page-creation opportunity.                      |
| `opportunity_contexts`       | Array             | Supporting pages or prompts, ordered by `position`.                                     |
| `action_item_id`             | Integer or `null` | The accepted Action record. It is `null` while the Opportunity is pending.              |
| `grid_row_id`                | Integer or `null` | The Action row created after acceptance. It is `null` while the Opportunity is pending. |

The `target_page` object includes the page `id`, `url`, and `folder`.

Each item in `opportunity_contexts` includes:

* `id`: The context ID.
* `rationale`: Why the context supports the Opportunity.
* `position`: The context's order.
* `resource`: The supporting page or prompt.

A prompt resource includes its `type`, `id`, prompt text, topic, and tags. A page resource includes its `type`, `id`, page URL, folder, and topics.

The shape above is for v2 Campaigns. Legacy v1 Campaigns use `opportunity_items` instead of `opportunity_contexts`.

## What happens after acceptance

Accepted opportunities appear in **Action** as Action rows. Each row keeps the brief you approved, the target page when there is one, and the context you included.

Declined opportunities stay out of **Action** so the Campaign remains focused on the work your team wants to pursue.

## Examples

### Page refresh review

For a refresh Campaign, review whether the target page has a clear reason to change. Strong candidates may have declining citation rate, outdated information, competitor pressure, or a gap between the current page and the prompts it should answer.

Keep supporting prompts that the refresh should answer. Remove prompts that are off-topic. Accept the opportunity when your team is ready to refresh that page.

### New page review

For a creation Campaign, review whether the brief describes a page your team can create. Strong candidates may have high-intent prompts, weak owned coverage, or competitor pages filling the gap.

Keep the prompts the new page should answer. Remove prompts that belong in a different Campaign. Accept the opportunity when your team can create the supporting content.


# Action

Use Campaign Action to run accepted opportunities through content work

Action is the Campaign workspace where accepted opportunities become rows of work. It operates like a [Grid](/actions/grids), so your team can add fields, run [Playbooks](/actions/playbooks) and [Workflows](/actions/workflow-concepts), review outputs, track publishing, and manage the work tied to the Campaign.

Use **Action** after your team accepts opportunities. The goal is to keep the work connected to the Campaign, instead of moving it into a separate process where impact is harder to measure.

## How Action works

1. Accept opportunities from **Opportunities**.
2. Open **Action** in the Campaign.
3. Open an Action cell to see the approved brief, target page, and included context.
4. Edit the brief in the Action cell if the instruction should change after acceptance.
5. Add the Playbooks or Workflows your team needs to create, refresh, review, or publish the work.
6. Add publishing, ownership, and handoff fields as needed.
7. Run the work from the accepted Action rows.

Each accepted opportunity creates one Action row. The row is the durable record of the approved action, not only a page or prompt cell.

## What an Action row contains

| Part                  | Use it for                                                                                                               |
| --------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| **Action cell**       | The approved brief, target page, and supporting context carried over from the opportunity.                               |
| **Playbook columns**  | Repeatable content tasks, such as refresh briefs, content updates, or review steps. See [Playbooks](/actions/playbooks). |
| **Workflow columns**  | Lower-level workflow processes tied to the accepted action. See [Workflows](/actions/workflow-concepts).                 |
| **Publishing fields** | CMS details, URLs, and handoff notes. See [Publish to CMS from Grid](/actions/grids/publish-to-cms-from-grid).           |

## Action JSON shape

When you map an Action column into a Playbook or Workflow, AirOps passes a structured object with the following shape:

An Action object contains these fields:

| Field                   | Shape            | Purpose                                                             |
| ----------------------- | ---------------- | ------------------------------------------------------------------- |
| `action_item_id`        | Integer          | The Action record's ID.                                             |
| `source_opportunity_id` | Integer          | The Opportunity that created the Action.                            |
| `rationale`             | String           | The editable brief for the work.                                    |
| `target_page`           | Object or `null` | The page to refresh. It is `null` for a page-creation Action.       |
| `contexts`              | Array            | The supporting pages or prompts included during Opportunity review. |

The `target_page` object includes `web_page_id`, `url`, and `brand_kit_id`.

Each item in `contexts` includes:

* `id`: The context ID.
* `rationale`: Why the context supports the Action.
* `position`: The context's order.
* `resource`: The supporting page or prompt.

A prompt resource includes its `type`, `id`, prompt text, topic, and tags. A page resource includes its `type`, `id`, page URL, folder, and topics.

The Campaign action type, such as `page_refresh` or `page_creation`, is configured on the Campaign. It is not included in the current Action execution payload.

## Track content updates

Use the **Track Content Update** step in the Playbook or Workflow that publishes or refreshes the page. Older workflows may refer to this step as **Track Event**.

The step records a content update in AirOps so Measurement can show when the work happened alongside page performance. It does not activate the Measurement tab. Measurement is available before Action rows or tracked events exist.

### Configure the step

1. Add **Track Content Update** after the step that publishes or refreshes the page.
2. Choose the event type:
   * **Page Published** for a new page.
   * **Page Refreshed** for an existing page.
3. Pass the final public URL of the page.
4. Use the URL from the Action row or the publishing result so the event matches the page that changed.
5. Run the step only after the content is live.

The URL must be the canonical page URL. Do not include a trailing slash or query parameters. AirOps uses the URL's domain to match the event to a Brand Kit.

### Make sure Measurement can use the event

* Use the live page URL, not a preview, staging, or CMS editor URL.
* Use **Page Refreshed** when updating an existing page and **Page Published** when creating a new page.
* Keep the tracked URL consistent with the page URL in the Action row.
* Confirm that the domain belongs to the Campaign's Brand Kit.
* Check the page's content changes in Measurement after the workflow runs.

Track Content Update events help you compare page performance before and after the work. They do not replace the Action row, page scope, or connected Google Search Console and Google Analytics data.

## Good Action setup

A good **Action** setup matches the Campaign objective. Add the columns your team needs to complete the work, but avoid turning **Action** into a general project tracker.

For a page refresh Campaign, **Action** might include a refresh Playbook, CMS fields, and publish details. For a page creation Campaign, **Action** might include a brief Playbook, supporting-source fields, and publishing notes.

Keep the Action brief specific enough that a Playbook or Workflow can use it. If the instruction is still too broad, edit it in the Action cell before you run the work.

## Examples

### Page refresh Campaign

Use **Action** to refresh accepted pages from the Campaign:

1. Open the Action cell and confirm the target page and brief.
2. Add the Playbook or Workflow that drafts refresh recommendations.
3. Add publishing fields for the CMS handoff or publish URL.
4. Add ownership fields for the teammate responsible for the work.
5. Track each page through review and publishing.

### Page creation Campaign

Use **Action** to create content that supports accepted prompts:

1. Open the Action cell and confirm the included prompts.
2. Add the Playbook or Workflow that turns the brief into a draft page.
3. Add fields for supporting sources and publishing notes.
4. Track whether each accepted action has shipped.


# Measurement

Measure Campaign impact across page performance, visibility, and sentiment

**Measurement** is the Campaign tab for reviewing the impact of your Campaign. It uses the Campaign's configured scope, tracked resources, and accepted work to show performance across AI search, search, traffic, and sentiment.

Use Measurement to answer practical questions:

* Did citation rate improve after the update?
* Did mention rate or share of voice move for the prompts this Campaign targets?
* Did sentiment shift for the theme the Campaign was built around?
* Did search traffic or engagement change after publishing?
* Which actions should shape the next round of opportunities?

## When Measurement populates

Measurement populates after the content associated with an accepted Action is published through a connected CMS or recorded with the **Track Content Update** step.

The **Measurement** tab may be visible before then, but the Campaign needs a recorded publication or refresh to show the resulting content change and compare performance. Use **Track Content Update** for changes that do not come through a connected CMS.

If a section is empty, check that the Action's content has been published or tracked, then review the selected scope and date range. Confirm that the required data source is connected.

{% hint style="info" %}
If a prompt or page used by the Campaign is no longer available, Measurement continues with the remaining resources.
{% endhint %}

## Measurement review flow

1. Open the Campaign.
2. Select **Measurement**.
3. Review **Page Performance**, **Visibility**, and **Sentiment**.
4. Set the date range and grain for the section you are reviewing.
5. Filter by page, folder, prompt, or topic when those filters are available.
6. Compare metric movement with the accepted actions and page content changes.
7. Use the results to adjust the next round of opportunity criteria, work in **Action**, or Campaign scope.

## Measurement sections

### Page Performance

Track how the pages in this Campaign perform across AI answers, search, traffic, and content changes.

| Metric                   | Description                                                  |
| ------------------------ | ------------------------------------------------------------ |
| **Page citation rate**   | How often the Campaign's pages are cited in AI responses.    |
| **Search metrics**       | Google Search Console metrics when that source is connected. |
| **Traffic metrics**      | Google Analytics metrics when that source is connected.      |
| **Page content changes** | Published changes tied to the pages in the Campaign.         |

Filter this section by date range, grain, page, or folder.

### Visibility

See how often your brand is cited and mentioned, and how much of the conversation it owns.

| Metric                   | Description                                                                       |
| ------------------------ | --------------------------------------------------------------------------------- |
| **Prompt citation rate** | How often your brand is cited in AI responses for the selected prompts or topics. |
| **Mention rate**         | How often your brand appears in AI responses.                                     |
| **Share of voice**       | Your share of mentions in AI responses.                                           |

Scope Visibility by **Prompts** or **Topics**. Prompt scope uses the prompts included on accepted Action rows. Topic scope uses the Campaign's configured topics, or the Brand Kit topics if the Campaign has none.

### Sentiment

Understand how AI answers describe your brand and which themes shape that perception.

Sentiment includes a score over time, theme details, and a breakdown of how AI responses characterize the brand for the selected prompts or topics.

## What Measurement includes

Measurement uses the Campaign's configured scope together with accepted Action rows:

* **Pages** can come from target pages on accepted Actions.
* **Prompts** can come from the supporting prompt context you include when you accept an opportunity.
* **Topics** come from the Campaign configuration, or from the Brand Kit when no topics are configured.
* Archived Action rows are not included.

Context review still matters for prompt-level measurement. Prompts you remove during review do not enter the Action or its related measurement scope.

## Examples

### Measure a page refresh Campaign

After your team refreshes accepted pages, use **Measurement** to compare:

1. Page citation rate before and after the updates.
2. Search and traffic movement from connected sources.
3. Page content changes for the pages updated through the Campaign.
4. Prompt citation rate, mention rate, and share of voice for the prompts included on those actions.

If performance improves, keep the Campaign running and use the same criteria to find more pages. If performance does not improve, tighten the opportunity criteria or adjust the refresh Playbook used in **Action**.

### Measure a new page Campaign

After your team publishes content for accepted prompts, use **Measurement** to compare:

1. Mention rate for the prompts included on the Action rows.
2. Share of voice against competitors.
3. Sentiment movement for the theme.
4. Page citation rate after the created pages become target pages in Action.

Use the results to decide whether to reinforce the same theme, broaden the prompt scope, or create a new Campaign for a different topic.


# Campaigns FAQ

Answers to common questions about AirOps Campaigns

Campaigns connect an AI search priority to recommended work, execution, and measurement. Use this FAQ to understand Opportunities, Action, and Measurement.

## Why does my Campaign look different?

Campaigns now use Campaign v2. Campaign v1 was an earlier, thinner version of Campaigns.

If you are comparing an older Campaign with a newer one, the newer Campaign may include contextual Opportunities, Campaign Actions, and the updated Measurement experience.

## What is the difference between an Opportunity and an Action?

An **Opportunity** is a recommendation for work. It includes a brief, and it may include a target page and supporting prompts or pages. Your team reviews the recommendation before accepting or declining it.

An **Action** is the accepted work that appears in the Campaign's Action workspace. It keeps the approved brief and context, and gives your team a row where you can run Playbooks or Workflows and track publishing.

## When does Measurement become available?

Measurement populates after the content associated with an accepted Action is published through a connected CMS or recorded with the **Track Content Update** step.

The **Measurement** tab may be visible before then, but the Campaign needs a recorded publication or refresh to show the resulting content change and compare performance. See [Measurement](/campaigns/measurement) for the sections and filters.

## How do supporting contexts affect Measurement?

Choose the supporting prompts or pages that belong to the action during Opportunity review. Included context is carried into **Action** and measured in **Measurement**. Removed context is not measured.

## How do I track a page publication or refresh?

Add the **Track Content Update** step to the Playbook or Workflow that publishes or refreshes the page. Use **Page Published** for new content and **Page Refreshed** for an existing page. Pass the final public URL after the content is live so AirOps can associate the update with the correct Brand Kit and page.

See [Action](/campaigns/action) for configuration guidance.

## Can I edit a Campaign after publishing?

You can continue editing a Campaign with Quill after publishing. Those changes do not currently update the Campaign's Opportunity Criteria. Improvements to this behavior are coming.

You can also generate opportunities, add opportunities manually when available, and manage triggers.

## Why is a Measurement section empty?

Check the following:

* The selected date range includes the period you want to review.
* The Measurement filters match the Campaign's configured topics, pages, or prompts.
* The required Google Search Console or Google Analytics integration is connected for search or traffic metrics.
* The pages or prompts are still available in the Brand Kit.

If the section remains empty, review the Campaign scope and the data source that powers the metric.


# Playbooks

Build and run Playbooks with natural-language instructions

Playbooks let you describe work as natural-language instructions, attach context like a Brand Kit, and run the process end to end while keeping reviewers in the loop.

{% hint style="warning" %}
Playbooks cannot be used inside Workflows. You can create a Playbook from an existing Workflow, but you cannot add a Playbook as a Workflow step.
{% endhint %}

A Playbook is made of:

* **A doc-style Playbook** that describes what the agent should do.
* **Inputs** that the Playbook accepts at run time, such as text, numbers, files, or a Brand Kit.
* **Sections** that contain instructions, tool calls, and Human Review checkpoints.
* **Tools** that the agent can use, including SEO Research, Web Research, Image and Video, MCP Connectors, and more.
* **Artifacts** that the Playbook produces, such as Markdown, HTML, JSON, CSV, PNG, JPG, or GIF files.
* **Triggers** that determine how a Playbook starts, including Schedule, Webhook, Monitor, and AEO Insight when enabled.

## Key concepts

| Term         | Definition                                                                                                                        |
| ------------ | --------------------------------------------------------------------------------------------------------------------------------- |
| Playbook     | The agent definition with Inputs, Sections, Tools, Artifacts, and a Trigger. Running a Playbook produces a Session.               |
| Section      | A unit of work in a Playbook. Each Section can include instructions, tool calls, and a Human Review block.                        |
| Input        | Information you provide when a Playbook runs, such as a keyword, target URL, file upload, or Brand Kit.                           |
| Tool         | An action the agent can take, from web and SEO research to native Tools like Slack and tools provided by MCP Connectors.          |
| Artifact     | A persistent output the Playbook produces, such as a blog post, image, analysis, or structured data.                              |
| Trigger      | A condition that starts a Playbook automatically. Trigger types include Schedule, Webhook, Monitor, and AEO Insight when enabled. |
| Session      | A single Playbook run. Each Session produces Artifacts and logs the work the agent performed.                                     |
| Inbox        | The workspace-level queue where reviewers see pending Human Review steps and Session outputs that need attention.                 |
| Run History  | The record of every Session a Playbook has produced.                                                                              |
| Human Review | A pause point where a person must approve or edit the agent's work before it continues.                                           |
| Quill        | The AirOps agent captain that helps you build and edit Playbooks from natural-language prompts. See [Quill](/quill).              |
| Memory       | Persistence across Sessions, used when a Playbook needs to remember what it has already surfaced or completed.                    |

## The two context sources that drive quality

Before you build a Playbook, make sure AirOps Insights and your Brand Kit are current. These two context sources shape the quality of every Session.

### Configure AirOps Insights

AirOps Insights is the source for AI search visibility data, including tracked prompts, LLM search responses, citations, competitor presence, and content opportunities. When a Playbook researches AEO opportunities or LLM search responses, it should use the data tracked in AirOps Insights rather than treating AI search as generic web research.

Cover the topics, personas, regions, and funnel stages you care about. Expand coverage from sources like Google Search Console queries, sales-call language, support tickets, and competitor citation gaps.

The common pattern is: AirOps Insights tracks prompts and LLM search responses, a Playbook monitors that data and finds opportunities, then a second Playbook takes action and creates or refreshes the output.

### Keep your Brand Kit fresh

Every Playbook can inherit your Brand Kit, so changes to voice, writing rules, audiences, regions, product lines, visual guidelines, and competitor context flow into Playbook output. A stale Brand Kit degrades downstream output.

Audit the Brand Kit on a recurring cadence. Refresh it when you launch a product, change positioning, add a new audience, or expand into a new region.

Use [Brand Kit Refresh](/context/brand-kit/refresh) to monitor live sources and propose Brand Kit edits for human approval.

{% hint style="warning" %}
Use the new Brand Kit format with Playbooks. Legacy Brand Kits do not work as well with Playbooks and can reduce output quality.
{% endhint %}

## Anatomy of a Playbook

When you open the Playbook editor, you will see:

* A header chip row above the first Section showing Tools, Inputs, Artifacts, and **Add Trigger**.
* Top-right actions for **Run Playbook**, **Publish**, and **Run History**.
* **Quill, the AirOps agent captain,** as a green floating button in the bottom-right of the editor.
* Reference pills inline as you write. Inputs and Brand Kits appear as green pills. Tools appear as gray pills with icons.

Type `/` in any Section to open the slash menu. The slash menu surfaces Tools, Inputs, Artifacts, and other references you can insert into your instructions.

## Playbook guides

* [Create a Playbook](/actions/playbooks/create-a-playbook)
* [Build a Playbook](/actions/playbooks/build-a-playbook)
* [Work with Artifacts](/actions/playbooks/artifacts)
* [Tools](/actions/playbooks/tools)
* [Run a Playbook](/actions/playbooks/run-a-playbook)
* [Playbook Triggers](/actions/playbooks/triggers)
* [Connect Playbooks to other tools](/actions/playbooks/integrations)
* [Apply Playbook best practices](/actions/playbooks/best-practices)
* [Troubleshoot Playbooks](/actions/playbooks/troubleshooting)


# Create a Playbook

Start a Playbook from scratch, from a Workflow, or from a template

You can start a Playbook from a blank Playbook, an existing Workflow, or a template.

## Build from scratch

Use a blank Playbook for net-new use cases or when no existing Workflow is close to what you need.

1. Click **Create**.
2. Select **Playbook**.
3. Select **Blank Playbook**.
4. Name the Playbook in the editor.
5. Add Inputs, Sections, Tools, Artifacts, and any Triggers the Playbook needs.
6. Run a test Session before publishing.

## Replicate a Workflow as a Playbook

Use **Replicate as Playbook** when you have an existing Workflow and want a Playbook with similar structure.

{% hint style="warning" %}
This conversion only goes from a Workflow to a Playbook. Playbooks cannot be added to or run inside Workflows.
{% endhint %}

1. Open the Workflow editor.
2. Open the dropdown next to **Publish**.
3. Select **Replicate as Playbook**.
4. Review the draft Playbook that AirOps creates.

{% hint style="warning" %}
QA the converted Playbook before publishing. The converter handles instructions and Inputs, but Tools such as web scrape or Google Search may not always populate. Add missing Tools with the slash menu, and confirm the Brand Kit Input uses the **Brand Kit** type.
{% endhint %}

## Install a template

Use templates when you want a working reference you can run, study, or fork. AirOps shows the published Playbook templates available to your workspace.

1. Click **Create**.
2. Select **Playbook**.
3. Select **From Template**.
4. Choose a template.
5. Complete any template-specific setup.

The template list can include content creation, content refresh, monitoring, and Brand Kit Refresh templates. If you select Brand Kit Refresh, AirOps asks you to choose an eligible Brand Kit and creates a refresh Playbook for that Brand Kit.

Templates are useful as implementation examples even when you plan to build a custom Playbook.

## Conversion checklist

When you convert an existing Workflow to a Playbook:

* Run **Replicate as Playbook** from the Workflow editor's Publish dropdown.
* Confirm the Brand Kit Input type is **Brand Kit**, not Text.
* Confirm you are using the new Brand Kit format.
* Confirm the Prompt coverage is complete for the use case.
* Add any Tools that did not carry through the conversion.
* Reference each Knowledge Base by name in every Knowledge Base search step.
* Reference Artifacts by name in downstream Sections.
* Add Human Review blocks at logical checkpoints.
* Configure the Trigger, if the Playbook should run automatically.
* Run a test Session and review every Artifact.
* Verify connected destinations like Slack, CMS tools, or Grids.


# Build a Playbook

Define Inputs, Sections, Tools, Artifacts, reviews, and triggers in a Playbook

Playbooks are built from Inputs, Sections, Tools, Artifacts, Human Review blocks, and Triggers. Define each part clearly so the agent has the right context and reviewers have the right control points.

## 1. Define Inputs

Inputs are how a Playbook receives information at run time.

| Type      | Use for                                                               |
| --------- | --------------------------------------------------------------------- |
| Text      | Keywords, URLs, prompts, free-form strings.                           |
| Number    | Counts, thresholds, rankings.                                         |
| File      | Documents, briefs, and exports the Playbook should read during a run. |
| Brand Kit | Voice, writing rules, audiences, regions, and visual guidelines.      |

Click **Show Advanced Settings** on an Input to set its variable name, description, placeholder, and default value.

## 2. Define Sections

Sections are the structural backbone of a Playbook. Each Section contains instructions and can optionally end with a Human Review block.

Organize Sections by logical phase, not by reviewer. A content pipeline might use:

1. **Intake and validation:** Parse the Input, validate it, and gather context.
2. **Research and strategy:** Search Knowledge Bases, analyze SERPs, and review competitors.
3. **Brief compilation:** Synthesize research into an actionable brief.
4. **Article draft and linking:** Generate the content and add internal links.
5. **Final review:** Pause for Human Review before publishing.

Templates use a consistent structure inside each Section. Use this pattern as a starting point, then adjust it to the work:

* **Objective:** Define what the Section should accomplish.
* **Inputs and references:** Name the Inputs, Artifacts, Brand Kit fields, Tools, and Knowledge Bases the Section should use. Insert them from the slash menu when possible.
* **Instructions:** List the work in clear numbered steps.
* **Output:** Name the Artifact the Section should write and the format it should use.

## 3. Add Tools

Type `/` in any Section to open the slash menu. Use it to insert Tools, Inputs, Artifacts, and other references into the Playbook instructions.

Inputs, Artifacts, and Tools become easier to reuse when you insert them from the slash menu instead of typing their names manually.

For the full Tool catalog, MCP Connectors, and best practices, see [Tools](/actions/playbooks/tools).

### AirOps

* **AirOps MCP:** Access your AirOps data, including Insights data, Brand Kits, Knowledge Bases, and Grids.
* **AirOps SEO Research:** Keyword research, domain analysis, and backlink data.
* **Page 360 Report:** Diagnose one owned URL across search performance, AI visibility, freshness, authority signals, and page content.
* **Page Versus Report:** Compare one owned URL against the pages winning in search and AI answers, then surface gaps to close.
* **Web Page Scrape:** Scrape content from web pages.

### SEO Research

* **DataForSEO:** SEO data and keyword research.
* **Moz:** SEO and domain analysis.
* **Google Search Console:** GSC data.

### Web Research

* **Google Search:** Search and retrieve Google results.
* **Parallel Web Systems:** Use the Parallel Search API, Parallel Extract API, and Parallel Task API to run web research, pull structured data from URLs, and process research inputs into structured outputs.
* **Firecrawl:** Crawl and scrape web pages.
* **Reddit:** For more details, [Talk to Sales](https://www.airops.com/book-a-call).

### Image and Video

* **Image Generation:** Generate hosted images with GPT Image 2 or Nano Banana 2.
* **Stock Images:** Search Getty Images or Unsplash, then fetch a selected image by ID for use in an Artifact or publishing step.

### Knowledge Management

* **Slack:** Read channel history and send messages.
* **Google Docs:** Read and edit Google Docs documents.

### B2B Enrichment

* **Brandfetch:** Retrieve brand assets and information.
* **Hunter.io:** Find and verify email addresses. For more details, [Talk to Sales](https://www.airops.com/book-a-call).

### Paid Ads

* **OpenAI Ads:** Retrieve insights from your OpenAI Ads account.

You can add any MCP Connector you need from your workspace MCP Connectors settings. Connected MCP tools appear in the Playbook editor's Tools list.

{% hint style="info" %}
When you add a Knowledge Base search step, reference the Knowledge Base by name in the step's Knowledge Base picker. Do not rely on auto-selection when the Playbook needs a specific source.
{% endhint %}

## 4. Add Human Review

Place Human Review as a block at the end of an existing Section. Do not create a separate Section only for review.

Use Human Review when someone needs to approve text, choose among options, or edit generated output before the next Section runs.

Reviewer options include:

* **Named person:** A specific team member.
* **Current User:** The person who triggered the Playbook.
* **Any member can review:** Any workspace member can review.

Reviews appear in the Inbox.

{% hint style="info" %}
Native conditional routing to multiple reviewers is not available yet. The current workaround is one Section per reviewer, with skip logic in the Section instructions. For example: "If complexity is not 3, skip this Section."
{% endhint %}

## 5. Declare Artifacts

Artifacts are the persistent outputs a Playbook produces. Declare one when a result needs to be stored, reviewed, shared, reused downstream, or published after the Session ends.

Supported Artifact types include:

* Markdown
* HTML
* JSON
* CSV
* PNG
* JPG
* GIF

Give each Artifact a clear name, then reference it from the Section that should write to it. If a Section does not produce an Artifact, its content remains in the Session context.

For stable links, comments, suggestions, mentions, Edit with AI, version history, and Grid reuse, see [Artifacts](/actions/playbooks/artifacts).

## 6. Configure a Trigger

Triggers determine how a Playbook starts.

| Trigger     | How it works                                                                                                                 | Best for                                                              |
| ----------- | ---------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
| Schedule    | Runs on a recurring cadence, such as every Monday at 9am.                                                                    | Weekly content audits, Brand Kit freshness checks, recurring reports. |
| Webhook     | Starts when an external system sends an HTTP request to the Playbook webhook URL.                                            | CMS publish events, form submissions, third-party integrations.       |
| Monitor     | Uses Parallel Web Systems to check a monitoring query every 12 hours and starts the Playbook when the condition is detected. | Competitive alerts, market monitoring, content health monitoring.     |
| AEO Insight | Starts when enabled AEO Insight thresholds are met, such as mention rate, share of voice, or citation rate changing.         | Programmatic refresh, competitive response, AEO coverage gaps.        |

{% hint style="info" %}
Triggers can use **Default** or a pinned Playbook version. **Default** follows the current published version. A pinned Trigger keeps using the selected version until you change it. If a new version changes Inputs, update the Trigger Input configuration before relying on future runs. See [Playbook Triggers](/actions/playbooks/triggers) for setup steps and webhook payload examples.
{% endhint %}

## 7. Use Quill to iterate

Quill is the AirOps agent captain for Playbook authoring. Click the green floating button in the bottom-right of the editor.

[Quill](/quill) can:

* Edit your Playbook from natural-language prompts.
* Rewrite a Workflow prompt as a brief agent instruction with context.
* Use file and image attachments to update the Playbook or Brand Kit.
* Reason about Playbook structure and suggest reorganizations.

Give Quill full context up front. In the chat, **Enter** submits, so keep each instruction in one paragraph.

Duplicate a Playbook before a large structural rewrite so you have a clean rollback point.

## 8. Publish

Publishing creates a versioned snapshot that downstream consumers can run from Grids and Triggers. Use a Webhook Trigger when an external system should start a Playbook programmatically. Drafts stay editable. Published versions are runnable references.

If you changed Inputs, update any Grid mappings and Trigger Input configuration that use this Playbook before running at scale.

### Restore a previous version

Open the version history from the Playbook editor, select the version you want, and click **Restore**. AirOps copies that version into the current draft so you can review it before publishing.

Restoring a version replaces the current draft. Download or publish any draft changes you need to keep before you restore an older version.

Restore is available on Free, Starter, Pro, Pro Plus, and Platform tiers.

## Import or export a Playbook

The editor can download a Playbook as Markdown or JSON. It can also import Markdown or JSON into an existing Playbook.

{% hint style="warning" %}
Importing Markdown or JSON overwrites the current Playbook content. Download the existing Playbook first if you need a rollback point.
{% endhint %}


# Artifacts and Collaboration

Store, review, and reuse persistent Playbook outputs

Artifacts are the persistent outputs a Playbook produces. Use an Artifact when a result needs to be reviewed, shared, reused in another process, or published after the Playbook run ends.

## How to Configure an Artifact

1. Open the Playbook editor.
2. Open **Artifacts** from the header chip row and add an Artifact.
3. Give the Artifact a clear name and select its type.
4. In the Section that should create the output, type `/` and insert the Artifact into the instructions.
5. Describe what the Section should write to the Artifact, including the expected structure or format.

Add a separate Artifact for each output that needs its own review or downstream use.

## Artifacts and Sessions

Every Playbook run creates a Session. The Session records the Inputs, execution details, Human Review status, and Artifacts created during that run.

Content that is not written to an Artifact remains in the Session context. Declare an Artifact when you need a durable output, such as a brief, article, report, structured dataset, or image.

Supported Artifact types include:

* Markdown
* HTML
* JSON
* CSV
* PNG
* JPG
* GIF

Give each Artifact a clear, stable name so it is easy to reference in Playbook instructions and downstream steps. Each generated Artifact also has a stable deep link that you can use to return to it or share it with teammates who have access.

## Review and edit an Artifact

Open an Artifact from its Session or from a linked Artifact cell in a Grid. You can collaborate on the output without changing the Playbook that produced it:

* **Comments:** Highlight part of an Artifact and leave a question or feedback.
* **Suggestions:** Propose an edit that a reviewer can accept or reject.
* **Mentions:** Tag a teammate in a comment or suggestion thread when their review is needed.
* **Edit with AI:** Highlight content and describe how you want that selection revised.

Comments and suggestions remain attached to the Artifact, keeping the review discussion with the output it refers to.

{% hint style="info" %}
Editing an Artifact changes that Session output. It does not update the Playbook instructions. To change future runs, edit and publish the Playbook.
{% endhint %}

For automated checks of AI Discoverability and Brand Adherence, see [Content Review and Quality Scores](/actions/grids/review-content-in-the-grid/content-review).

## Compare or recover versions

Artifact version history preserves earlier versions as the output changes.

Open version history to:

* See when each version was created.
* Compare an earlier version with the current content.
* Return to an earlier version when you need to recover overwritten or unwanted changes.

Use version history before publishing when several people or AI-assisted edits have changed the same output.

## Use Artifacts in Grids

An Artifact column links a Grid cell to the Playbook Artifact in its Session. The link is bidirectional:

* An edit made from the Session appears in the Grid cell.
* An edit opened from the Grid cell updates the same Session Artifact.

This lets teams search and sort outputs in a Grid, use an Artifact as an Input to a downstream Playbook or Workflow, and carry the reviewed output into CMS publishing without copying it into a separate content column.

See [Add Columns in the Grid](/actions/grids/add-columns-in-the-grid#artifact-columns) to add and use an Artifact column.


# Tools

Give Playbooks the actions they need, from SEO and AEO research to web scraping, image generation, and MCP Connectors

Tools are the actions a Playbook can take during a Session. A Playbook describes the work in natural language, and Tools are how it does that work: searching the web, pulling SEO and AEO data, scraping pages, generating images, and reaching into your stack through MCP Connectors.

Tools are one of the core building blocks of a Playbook, alongside Inputs, Sections, Artifacts, and Triggers. Without Tools, a Playbook can only reason over the context you pass in. With Tools, it can gather fresh data, take action in external systems, and ground its output in real research.

## How to add a Tool

Type `/` in any Section to open the slash menu. The slash menu surfaces Tools, Inputs, Artifacts, and other references you can insert directly into your instructions.

1. Place your cursor in the Section instruction where the Tool should be used.
2. Type `/` to open the slash menu.
3. Select the Tool you want.
4. The Tool appears inline as a gray pill with an icon.

Insert Tools from the slash menu instead of typing their names manually. Inserted Tools become easier to reuse, and the Playbook resolves them to the right action.

You can also review every Tool a Playbook uses from the header chip row above the first Section, which shows Tools, Inputs, Artifacts, and **Add Trigger**.

## Tool categories

The Playbook editor groups Tools by the work they help a Playbook complete. These categories cover the built-in Tool groups and MCP Connector setup.

* [**AirOps**](/actions/playbooks/tools/airops): Use AirOps workspace data, AEO and SEO reports, and page scraping.
* [**SEO Research**](/actions/playbooks/tools/seo-research): Pull keyword, domain, backlink, and search performance data.
* [**Web Research**](/actions/playbooks/tools/web-research): Search the web, scrape pages, crawl sites, and extract structured research.
* [**Image & Video**](/actions/playbooks/tools/image-and-video): Generate hosted images or retrieve stock images for downstream publishing.
* [**Knowledge Management**](/actions/playbooks/tools/knowledge-management): Work with Slack, Google Docs, Google Drive, Gmail, and Google Sheets.
* [**B2B Enrichment**](/actions/playbooks/tools/b2b-enrichment): Retrieve brand, contact, and review data.
* [**Paid Ads**](/actions/playbooks/tools/paid-ads): Pull OpenAI Ads performance insights.
* [**MCP Connectors**](/actions/playbooks/tools/mcp-connectors): Add workspace-configured connectors that extend the Playbook tool list.

{% hint style="info" %}
Tools for AEO and SEO research, such as the Page 360 Report, Page Versus Report, AirOps SEO Research, DataForSEO, Moz, and Google Search Console, work best when AirOps Insights is current. When a Playbook researches AI search visibility, point it at the prompts and LLM responses tracked in AirOps Insights rather than treating AI search as generic web research.
{% endhint %}

## Built-in research helpers

Playbooks can use built-in research helpers during a Session when the run needs stronger sourcing. The citation researcher finds current, authoritative sources and can prioritize preferred sources you provide. The claim checker reviews claims against citations before the Artifact is ready for review.

You do not add these helpers from the Tool menu or choose their model directly. AirOps calls them automatically as part of the Playbook harness when the run needs source research or claim verification.

## Best practices

* Name the Tools a Section should use in that Section's instructions, and insert them from the slash menu so the Playbook resolves them reliably.
* Reference each Knowledge Base by name in Knowledge Base search steps instead of relying on auto-selection.
* For AEO and SEO research, keep AirOps Insights current so research Tools return data grounded in your tracked prompts and competitors.
* Use the **Image Generation** Tool or stock image Tools when a downstream step needs hosted images, such as CMS publishing.
* When you convert a Workflow to a Playbook, confirm that Tools such as web scrape or Google Search carried through, and add any that did not.


# AirOps

Use AirOps-native tools for workspace data, AEO and SEO reports, and page scraping

AirOps Tools give Playbooks direct access to AirOps workspace data and built-in research reports. Use them when a Playbook needs Brand Kit context, Knowledge Base context, Insights data, page diagnostics, competitive page analysis, or scraped page content.

## Tools

### AirOps MCP

Access AirOps workspace data, including Insights data, Brand Kits, Knowledge Bases, and Grids. This Tool is enabled by default for new Playbooks.

Use **AirOps MCP** when a Playbook needs to:

* Pull Brand Kit context before drafting or reviewing content.
* Search a Knowledge Base for source material.
* Read Grid data or use Insights data tied to tracked prompts, pages, citations, and competitors.

### AirOps SEO Research

Retrieve keyword research, domain analysis, and backlink data through AirOps.

Use **AirOps SEO Research** for curated SEO lookups, such as keyword overview, related keywords, ranked keywords, site metrics, and linking domains.

### Page 360 Report

Build a diagnostic report for one owned URL before you refresh, expand, or troubleshoot it. Page 360 combines GSC, GA4, AEO performance trends, SEO keywords, AI prompt coverage, AI referrers, metadata, freshness signals, backlinks, link health, CTAs, authority signals, and scraped page content.

Use **Page 360 Report** when a Playbook needs a complete view of one owned page before recommending changes. Include the Brand Kit, page URL, and time range in the instructions.

### Page Versus Report

Compare one owned URL against pages winning in search and AI answers. Page Versus can anchor analysis to a target keyword or prompt, then compare competitor pages, keyword gaps, content gaps, search intent, topic coverage, headings, FAQs, page structure, metadata, backlinks, and optional live citation checks.

Use **Page Versus Report** when a Playbook needs competitive guidance. Include the owned page URL and either a target keyword, target prompt, or both. You can also tell the Playbook whether to focus on SEO, AEO, or both.

### Web Page Scrape

Scrape content from web pages for analysis, rewriting, enrichment, or source review.

Use **Web Page Scrape** when the Playbook needs page content as text, HTML, or markdown. For dynamic pages, tell the Playbook to render JavaScript or remove boilerplate if the main content is hard to extract.

## How to Configure

1. Open the Playbook editor.
2. Place your cursor in the Section instruction where the Tool should be used.
3. Type `/` and select the AirOps Tool from the menu.
4. Describe when the Playbook should use the Tool and what result it should produce.
5. For report Tools, include the page URL, Brand Kit, target keyword, or target prompt in the Section instructions.

## Parameters

| Tool                    | Required context                                                                        | Optional guidance                                                                                               |
| ----------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
| **AirOps MCP**          | The AirOps resource to read from, such as a Brand Kit, Knowledge Base, Insight, or Grid | Explain which fields, files, prompts, or rows matter                                                            |
| **AirOps SEO Research** | Keyword, domain, URL, or competitor to research                                         | Add region, language, or comparison criteria                                                                    |
| **Page 360 Report**     | Owned page URL and Brand Kit                                                            | Add `7-days`, `30-days`, or `90-days` as the time range, plus any issues to inspect                             |
| **Page Versus Report**  | Owned page URL and Brand Kit                                                            | Add target keyword, target prompt, competitor limit, AI provider, citation check instructions, or SEO/AEO focus |
| **Web Page Scrape**     | URL to scrape                                                                           | Add output format, JavaScript rendering, proxy, headers, cleanup needs, or sections to extract                  |

## Examples

```markdown
Use **Page 360 Report** to analyze `target_url`. Preserve sections that drive search traffic, then identify content gaps and outdated claims.
```

```markdown
Use **AirOps MCP** to pull Brand Kit context before drafting. Apply the product line, audience, and writing rules that match this page.
```


# SEO Research

Use SEO research tools to gather keyword, domain, backlink, and search performance data

SEO Research Tools help Playbooks gather search data before planning, refreshing, or publishing content. Use them when the Playbook needs keyword volume, ranking data, domain metrics, backlink context, or Google Search Console performance.

## Tools

### DataForSEO

Retrieve SEO data and keyword research, including keyword metrics, ranked keywords, related keywords, search intent, domain competitors, domain intersections, relevant pages, and organic SERP results.

Use **DataForSEO** when a Playbook needs broad keyword and SERP data. It can support:

* Keyword overview, search volume, CPC, competition, search intent, and monthly trends.
* Organic SERP results for a keyword.
* Ranked keywords for a domain or URL.
* Competitor domains, keyword gaps, relevant pages, related keywords, keyword suggestions, and bulk keyword difficulty.

### Moz

Retrieve SEO and domain analysis, including authority metrics, link metrics, keyword metrics, and related keyword ideas.

Use **Moz** when a Playbook needs domain authority, page authority, spam score, linking domain data, or keyword suggestions from Moz.

### Google Search Console

Read Google Search Console data for connected sites. Use it to inspect clicks, impressions, CTR, average position, pages, queries, and performance trends.

Use **Google Search Console** when a Playbook needs first-party performance data for owned pages. The Playbook can list available sites, then query search analytics by page, query, country, device, or date.

## How to Configure

1. Open the Playbook editor.
2. Type `/` in the Section where search data should be gathered.
3. Select the SEO Research Tool.
4. For **Google Search Console**, connect a Google Search Console authentication if prompted.
5. Tell the Playbook which site, page, query, competitor, region, language, and date range to use.

## Parameters

| Tool                      | Required context                        | Optional guidance                                                              |
| ------------------------- | --------------------------------------- | ------------------------------------------------------------------------------ |
| **DataForSEO**            | Keyword, URL, domain, or competitor set | Add location, language, search intent, limits, and comparison rules            |
| **Moz**                   | Keyword, URL, or domain                 | Add metric type, locale, scope, and result limit                               |
| **Google Search Console** | Connected site and date range           | Add dimensions, filters, query text, page URL, country, device, or search type |

## Examples

```markdown
Use **Google Search Console** to find queries where `target_url` has impressions but weak CTR over the last 30 days.
```

```markdown
Use **DataForSEO** to compare our domain against the listed competitors and return keyword gaps with search intent.
```


# Web Research

Use web research tools to search, scrape, crawl, and extract information from the web

Web Research Tools help Playbooks gather current source material from search results, pages, websites, and Reddit threads. Use them when the Playbook needs external evidence before drafting, refreshing, comparing, or summarizing content.

## Tools

### Google Search

Search Google and retrieve structured search results.

Use **Google Search** when a Playbook needs a search results snapshot. It can return links only, title and snippet summaries, organic results as JSON, or the raw search response.

### Parallel Web Systems

Use Parallel Search, Parallel Extract, and Parallel Task capabilities to run web research, extract structured data from URLs, and process research inputs into structured outputs.

Use **Parallel Web Systems** when the Playbook needs structured research instead of only raw search results. It can search, extract fields from URLs, or process inputs into a schema you define.

### Firecrawl

Crawl and scrape web pages. Use it when the Playbook needs page content, site maps, links, screenshots, or structured crawl output.

Use **Firecrawl** when a Playbook needs to map a site, scrape a page, crawl multiple pages, or return page assets such as links and screenshots.

### Reddit Scrape

Scrape Reddit posts and comments. For access details, [Talk to Sales](https://www.airops.com/book-a-call).

Use **Reddit Scrape** when a Playbook needs community language, objections, feature requests, or nested comment context from a specific Reddit thread.

## How to Configure

1. Open the Playbook editor.
2. Type `/` in the Section where web research should happen.
3. Select the Web Research Tool.
4. Add the query, URL, site, or Reddit thread the Playbook should research.
5. Tell the Playbook how to judge source quality and what output format to return.

## Parameters

| Tool                     | Required context                  | Optional guidance                                                              |
| ------------------------ | --------------------------------- | ------------------------------------------------------------------------------ |
| **Google Search**        | Search query                      | Add region, result count, site filter, date sensitivity, or output format      |
| **Parallel Web Systems** | Search query, URLs, or task input | Add extraction objective, output schema, processor tier, or source constraints |
| **Firecrawl**            | URL or domain                     | Add crawl depth, output format, page limit, screenshot needs, or cleanup rules |
| **Reddit Scrape**        | Reddit post or thread URL         | Add comment depth, themes to extract, or sentiment criteria                    |

## Examples

```markdown
Use **Google Search** to find current pages ranking for `target_keyword`. Summarize the top patterns without copying source text.
```

```markdown
Use **Firecrawl** to scrape the competitor URLs and extract headings, FAQs, CTAs, and examples into a comparison table.
```


# Image & Video

Use image and video tools to generate hosted visual assets for Playbook outputs

Image & Video Tools help Playbooks create and retrieve visual assets that downstream systems can reference. Use them when a Playbook needs a generated image, a stock image, or a hosted image URL for a CMS, landing page, social post, or content artifact.

## Tools

### Image Generation

Generate hosted images with GPT Image 2 or Nano Banana 2. Hosted image outputs are useful when a downstream Tool publishes content to a CMS or stores a finished artifact.

Use **Image Generation** when a Playbook needs a new image or an edited source image. GPT Image 2 supports high-resolution generation and strong text rendering. Nano Banana 2 is useful for fast generation and image editing workflows.

### Search Stock Images

Search Getty Images or Unsplash for relevant stock photography. Use **Search Stock Images** when a Playbook needs sourced imagery instead of generated imagery.

### Fetch Stock Image with ID

Fetch a specific stock image from Getty Images or Unsplash by its image ID. Use this after a search step when the Playbook has selected the image that should appear in the final Artifact or downstream publish action.

## How to Configure

1. Open the Playbook editor.
2. Type `/` in the Section where the visual should be created.
3. Select **Image Generation**, **Search Stock Images**, or **Fetch Stock Image with ID**.
4. Describe the image subject, style, source, aspect ratio, dimensions, and usage context.
5. Tell the Playbook where to use the hosted image URL in the final artifact.

## Parameters

| Tool                          | Required context                | Optional guidance                                                                                                      |
| ----------------------------- | ------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| **Image Generation**          | Prompt describing the image     | Add model preference, dimensions, image format, quality, number of images, source image, mask, or editing instructions |
| **Search Stock Images**       | Search query and stock provider | Add image style, subject, orientation, usage rights, or result count                                                   |
| **Fetch Stock Image with ID** | Image ID and stock provider     | Add requested size or downstream placement                                                                             |

## Examples

```markdown
Use **Image Generation** to create a 1200x630 OpenGraph image for the article. Match the Brand Kit visual guidelines and return the hosted image URL.
```

```markdown
Use **Search Stock Images** to find a horizontal Unsplash image for the article hero. Select the image that best matches the Brand Kit visual guidelines, then use **Fetch Stock Image with ID** to return the hosted image URL.
```


# Knowledge Management

Use knowledge management tools to work with Slack and Google Workspace content

Knowledge Management Tools let Playbooks read, create, and update collaboration content. Use them when a Playbook needs to pull context from Slack or Google Workspace, create a draft, update a spreadsheet, upload a file, or send a message.

## Tools

### Slack

Read channel history and threads, look up users, retrieve files and canvases, and search messages. The Tool can also send channel messages and thread replies, send direct messages, add reactions, and perform supported channel and canvas actions.

Use **Slack** when a Playbook needs to gather context from conversations, coordinate work in a channel, or publish a message after generating output.

### Google Docs

Read and edit Google Docs documents. Use it when a Playbook needs to turn research or generated content into a Google Doc.

Use **Google Docs** when the final deliverable should live in Google Docs. The Playbook can read a document, create a new document, or create a formatted document from HTML.

### Google Drive

Upload, download, list, and manage files in Google Drive.

Use **Google Drive** when the Playbook needs to list files, upload generated assets, place files in a folder, read metadata, or manage Drive files.

### Gmail

Send plain-text or HTML emails through Gmail.

Use **Gmail** when the Playbook should draft and send an email through an authenticated Gmail account. Include approval requirements in the Section if the email should not be sent automatically.

### Google Sheets

Read, update, append, and create Google Sheets spreadsheets.

Use **Google Sheets** when the Playbook needs structured rows, planning tables, reporting outputs, or spreadsheet-backed task lists. It can read ranges, update cells, append rows, and create new spreadsheets.

## How to Configure

### Slack

1. Open the Playbook editor.
2. Open the **Tools** panel and add **Slack**.
3. Select an existing Slack workspace authentication. If one is not available, connect Slack when prompted.
4. Add Slack to the Playbook.
5. Reference the Slack Tool in the Section that should use it, then include the relevant channel, thread, user, file, canvas, or search query in the instructions.

{% hint style="info" %}
Adding Slack notifications for triggered runs or Human Review does not add the Slack Tool to a Playbook. Configure the Tool separately when the Playbook needs to read or act on Slack content.
{% endhint %}

### Other Knowledge Management Tools

1. Open the Playbook editor.
2. Type `/` in the Section where the Playbook should use the collaboration Tool.
3. Select the Tool.
4. Connect the required authentication if prompted.
5. Include the document, file, email recipient, or spreadsheet the Playbook should use.

## Parameters

| Tool              | Required context                                        | Optional guidance                                                                     |
| ----------------- | ------------------------------------------------------- | ------------------------------------------------------------------------------------- |
| **Slack**         | Channel, thread, message, file, canvas, or user context | Add date range, search query, message format, reaction, or rules for outbound actions |
| **Google Docs**   | Document URL, document ID, or new document title        | Add editing scope, formatting requirements, or export expectations                    |
| **Google Drive**  | File ID, folder ID, file path, or upload target         | Add MIME type, folder placement, naming rules, or cleanup instructions                |
| **Gmail**         | Recipient, subject, and body                            | Add CC, BCC, HTML formatting, attachments, send timing, or approval requirements      |
| **Google Sheets** | Spreadsheet ID, sheet name, or range                    | Add value input mode, append behavior, headers, formulas, or formatting rules         |

## Examples

```markdown
Use **Google Sheets** to append one row per approved topic to the planning spreadsheet. Include topic, target keyword, status, and owner.
```

```markdown
Use **Slack** to read the launch channel and its threads from the last 14 days. Retrieve linked files and canvases when they contain relevant context, then summarize open questions before drafting the update. Do not send the update.
```


# B2B Enrichment

Use B2B enrichment tools to retrieve brand, contact, and review data

B2B Enrichment Tools help Playbooks gather company, brand, contact, and review context. Use them when a Playbook needs account research, brand assets, email discovery, or product review evidence.

## Tools

### Brandfetch

Retrieve brand assets and information, including logos, colors, fonts, social links, and company details.

Use **Brandfetch** when a Playbook needs brand identity context from a company domain. It can help populate competitor tables, design briefs, partner profiles, and account research.

### G2

Access G2 product reviews, ratings, and Q\&A data for connected products.

Use **G2** when a Playbook needs customer review evidence. The Tool can list products available to the connected account, then fetch reviews for a selected product with optional date filters.

Connect **G2** in **Settings → MCP Connectors** before you enable it in a Playbook. The standard flow uses the AirOps OAuth app. After you connect G2, open the Playbook editor, open the **Tools** panel, and turn on **G2** so the Playbook can use G2 review data during content creation runs.

<details>

<summary>Use your own G2 OAuth app</summary>

If your team uses its own scoped OAuth app, complete the advanced setup before you continue the G2 OAuth flow in AirOps.

1. In My.G2, open your G2 OAuth app and find the client ID and secret ID.
2. In AirOps, paste both values into **Advanced OAuth client settings**.
3. Click **Save**, then copy the AirOps callback URL: `https://app.airops.com/api/mcp_connectors/oauth/callback`.
4. Return to the G2 OAuth app in My.G2 and add the callback URL to the redirect URIs.
5. Return to AirOps and continue the OAuth flow.

</details>

### Hunter.io

Find and verify email addresses. For access details, [Talk to Sales](https://www.airops.com/book-a-call).

Use **Hunter.io** when a Playbook needs contact discovery or email verification. It can search for emails by domain or company, find a person's email address, and verify deliverability for a known email.

## How to Configure

1. Connect the required data source. For **G2**, open **Settings → MCP Connectors** and complete the G2 OAuth flow.
2. Open the Playbook editor.
3. Open the **Tools** panel or type `/` in the Section where enrichment data should be gathered.
4. Select or turn on the B2B Enrichment Tool.
5. Provide the domain, company, product, person, or review filters the Playbook should use.

## Parameters

| Tool           | Required context                               | Optional guidance                                                     |
| -------------- | ---------------------------------------------- | --------------------------------------------------------------------- |
| **Brandfetch** | Company domain                                 | Add requested asset types, brand fields, or fallback rules            |
| **G2**         | Connected G2 account and product               | Add date range, review filters, rating criteria, or themes to extract |
| **Hunter.io**  | Domain, company, person name, or email address | Add verification requirements, role filters, or confidence thresholds |

## Examples

```markdown
Use **Brandfetch** to retrieve brand colors, logos, and social links for each competitor domain before building the comparison table.
```

```markdown
Use **G2** to pull recent reviews for the selected product and group feedback by feature request, objection, and proof point.
```


# Paid Ads

Use paid ads tools to retrieve OpenAI Ads account, campaign, ad group, and ad insights

Paid Ads Tools help Playbooks inspect advertising performance before creating reports, campaign briefs, or optimization recommendations.

## Tools

### OpenAI Ads

Retrieve insights from your OpenAI Ads account, including account, campaign, ad group, and ad-level performance.

Use **OpenAI Ads** when a Playbook needs paid performance data before writing a report, summarizing campaign health, or recommending budget and creative changes. The Tool can retrieve account-level, campaign-level, ad group-level, and ad-level insights.

## How to Configure

1. Open the Playbook editor.
2. Type `/` in the Section where ads performance should be analyzed.
3. Select **OpenAI Ads**.
4. Connect the required OpenAI Ads authentication if prompted.
5. Add the account, campaign, ad group, ad ID, date range, and metrics the Playbook should inspect.

## Parameters

| Tool           | Required context             | Optional guidance                                                                                                                            |
| -------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| **OpenAI Ads** | Connected OpenAI Ads account | Add campaign ID, ad group ID, ad ID, date range, daily breakdown, and target metrics such as impressions, clicks, CTR, spend, or conversions |

## Examples

```markdown
Use **OpenAI Ads** to compare campaign performance for the last 30 days. Return spend, CTR, conversions, and the strongest optimization recommendation.
```


# MCP Connectors

Add workspace MCP Connectors so Playbooks can use external systems and custom tools

MCP Connectors extend the Playbook tool list with systems configured in your workspace. Use them when a Playbook needs to read context from or take action in tools such as Notion, GitHub, Asana, your CMS, or another MCP-compatible service.

MCP Connectors can appear inside the same category groups as built-in Tools when AirOps recognizes the connector category. If a connector does not have a category, it appears with the other workspace connectors.

## How to Configure

1. Add the Connector in your workspace MCP Connectors settings.
2. Open the Playbook editor.
3. Open the **Tools** panel or type `/` in a Section.
4. Turn on or select the connected MCP tool.
5. Describe when the Playbook should use the connector and what action it should take.

Connected MCP tools appear in the Playbook editor's Tools list alongside the built-in catalog. See [MCP](/developers/getting-started) for setup and connector details.

{% hint style="info" %}
Use the native **Slack** Tool when a Playbook needs to read channel history or send messages. You can still add Slack through an MCP Connector if your workspace uses a custom connector setup.
{% endhint %}

## Parameters

MCP Connector parameters depend on the connector and the tools it exposes. Check the connector's schema in the Playbook editor, then name the exact resource, action, filters, and output format the Playbook should use.

When you add MCP Connector instructions, include:

* The connected system the Playbook should use.
* The record, page, issue, project, CMS entry, or file to read or update.
* The action the Playbook should take and any approval rules before writing changes.

## Examples

```markdown
Use the connected CMS Tool to find the article for `target_url`, update the draft body, and preserve the existing metadata.
```


# Run a Playbook

Run Playbooks manually, from Grids, or with Triggers

You can run a Playbook manually from the editor, from a Grid, or automatically with a Trigger. Each run creates a Session with execution details and Artifacts.

## Run manually

Use a manual run when you are testing a Playbook or running it for a single use case.

1. Open the Playbook editor.
2. Click **Run Playbook**.
3. Provide any required Inputs.
4. Review the Session output and Artifacts.

{% hint style="info" %}
Runs started from the Playbook editor use testing tasks before production tasks. Each workspace has 50,000 free testing tasks per month that can be used for Workflow and Playbook testing. If your workspace uses all testing tasks, AirOps uses production tasks for additional editor runs. You can review testing task usage in the **Usage** tab.
{% endhint %}

## Run from a Grid

Use a Grid when you want to run a published Playbook across rows of structured data.

1. Open the Grid.
2. Click **+ Add Column**.
3. Select the **Playbooks** tab.
4. Search for the Playbook.
5. Map Grid columns, static values, or Brand Kits to the Playbook Inputs.
6. Run the Playbook for one row or in bulk.

{% hint style="info" %}
When a Playbook runs from a Grid, it uses the version and Input mappings configured on that Grid column. Edits you make in the Session chat apply to the Artifacts, not to the Playbook. To change the Playbook itself, open it in the editor.
{% endhint %}

## Run automatically

Use a Trigger when the Playbook should start on a schedule, from an external event, or from an AirOps signal.

Trigger types include:

* **Schedule:** Run on a recurring cadence.
* **Webhook:** Run from an HTTP request.
* **Monitor:** Run when Parallel Web Systems detects a condition from your monitoring query.
* **AEO Insight:** Run when an enabled Insights threshold is met.

Triggered runs land in Run History. Runs that need Human Review also appear in the Inbox.

{% hint style="info" %}
For Trigger setup, version settings, and webhook payload examples, see [Playbook Triggers](/actions/playbooks/triggers).
{% endhint %}

## Versions and Input changes

Grid columns and Triggers can use **Default** or a pinned Playbook version.

* **Default** follows the current published version.
* **Pinned** keeps using the selected version until you change it.

{% hint style="warning" %}
If a new Playbook version changes Inputs, update any Grid column mappings and Trigger Input configuration before running at scale. New required Inputs without mapped or configured values can make runs fail validation or be skipped.
{% endhint %}

## Review Sessions

Every run produces a Session. A Session contains:

* The full execution log.
* Inputs used for the run.
* Every Artifact the Playbook produced.
* Human Review status, when the Playbook includes review blocks.

Sessions are visible in **Run History** from the top-right of the Playbook editor and in the Inbox when review is required.

## Collaborate on Artifacts

Artifacts support comments, suggestions, mentions, version history, and AI-assisted edits. Use these controls when a Session output needs review before publishing or downstream use. Edits affect the Artifact for that Session, not the Playbook instructions.

See [Artifacts](/actions/playbooks/artifacts) for the full collaboration, recovery, stable-link, and Grid workflow.

## Interrupt or rerun a Grid Session

In a Grid, Playbook cells show the current Session status. You can open the Session from the cell, interrupt a queued or running Session, and rerun terminal Sessions. If a Session ran on an older Playbook version, the cell shows a warning so you can rerun it on the current version.

## Use two Playbooks for monitoring and action

Many Playbook setups use a two-Playbook pattern.

The first Playbook monitors data and finds work for you. It can run on a Trigger, scan AirOps Insights, identify opportunities, and push them to a Grid with the AirOps MCP, such as URLs to refresh or prompts to target.

The second Playbook takes action on those rows and produces the output. You can run it manually or as a Grid action on the row produced by the first Playbook, such as drafting a blog post for a target prompt or refreshing an existing page.

One Playbook finds the work. The other Playbook does the work and gets you to an output. You can use either pattern alone, but they are commonly composed.

{% hint style="info" %}
A Playbook that monitors data commonly uses Memory to avoid recommending the same item again within a configured window, such as 60 days.
{% endhint %}


# Playbook Triggers

Start Playbooks automatically with Schedule, Webhook, Monitor, and AEO Insight Triggers

Playbook Triggers start published Playbooks automatically. Use them when a Playbook should run on a schedule, respond to an HTTP request, monitor a condition, or react to an enabled AirOps signal.

## Overview

Triggers run a selected Playbook version and pass configured Input values into the run. Triggered runs appear in **Run History**. Runs that need Human Review also appear in the Inbox.

| Trigger         | How it works                                                                                                                 | Best for                                                              |
| --------------- | ---------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
| **Schedule**    | Runs on a recurring cadence, such as every Monday at 9am.                                                                    | Weekly content audits, Brand Kit freshness checks, recurring reports. |
| **Webhook**     | Starts when an external system sends an HTTP request to the Playbook webhook URL.                                            | CMS publish events, form submissions, third-party integrations.       |
| **Monitor**     | Uses Parallel Web Systems to check a monitoring query every 12 hours and starts the Playbook when the condition is detected. | Competitive alerts, market monitoring, content health monitoring.     |
| **AEO Insight** | Starts when enabled AEO Insight thresholds are met, such as mention rate, share of voice, or citation rate changing.         | Programmatic refresh, competitive response, AEO coverage gaps.        |

{% hint style="info" %}
AEO Insight Triggers are available only when enabled for your workspace.
{% endhint %}

## How to Configure

Configure a Trigger after you publish the Playbook version you want downstream systems to run.

1. Open the published Playbook.
2. Click **Add Trigger**.
3. Select the Trigger type.
4. Choose **Default** or a pinned Playbook version.
5. Configure the Trigger settings.
6. Set any required Input values that should come from the Trigger.
7. Save the Trigger.
8. Review the first triggered Session in **Run History**.

For Webhook Triggers, copy the webhook URL after you save the Trigger. Send a `POST` request to that URL with the payload format below.

## Parameters

| Parameter           | Applies to   | Description                                                                                                                                                        |
| ------------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Trigger type        | All Triggers | The condition that starts the Playbook, such as **Schedule**, **Webhook**, **Monitor**, or **AEO Insight**.                                                        |
| Version             | All Triggers | The Playbook version the Trigger runs. **Default** follows the current published version. A pinned version keeps running the selected version until you change it. |
| Input configuration | All Triggers | Values the Trigger passes into the Playbook run. Required Inputs need a value from the Trigger configuration or the webhook payload.                               |
| Webhook URL         | Webhook      | The URL external systems call to start the Playbook. Copy this URL from the Webhook Trigger configuration.                                                         |
| Request body        | Webhook      | JSON body containing an `inputs` object with Playbook Input variable names as keys.                                                                                |

{% hint style="warning" %}
If a new Playbook version changes Inputs, update any Grid column mappings and Trigger Input configuration before running at scale. New required Inputs without mapped or configured values can make runs fail validation or be skipped.
{% endhint %}

## Webhook Payload Format

The request body must include an `inputs` object. Each key inside `inputs` should match a Playbook Input variable name.

To find or edit an Input variable name, open the Input and click **Show Advanced Settings**.

```json
{
  "inputs": {
    "value": "overridden value input",
    "non_req": "optional override",
    "non_req_2": "another optional override"
  }
}
```

| Field                          | Required             | Description                                                                                                                                                                                                                                      |
| ------------------------------ | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `inputs`                       | Yes                  | Object containing the Playbook Input values for the run.                                                                                                                                                                                         |
| `inputs.<input_variable_name>` | Depends on the Input | Value for a Playbook Input. Use the Input variable name, not the display label. Required Inputs need a value from the Trigger configuration or the webhook payload. Optional Inputs can be omitted unless you want to override them for the run. |

## Examples

### Webhook request

Replace `WEBHOOK_TRIGGER_URL` with the URL AirOps gives you when you configure the Webhook Trigger.

```bash
curl --request POST \
  --url 'WEBHOOK_TRIGGER_URL' \
  --header 'content-type: application/json' \
  --data '{
    "inputs": {
      "value": "overridden value input",
      "non_req": "optional override",
      "non_req_2": "another optional override"
    }
  }'
```


# Integrations

Connect Playbooks to Grids, Slack, and CMS publishing

Playbooks can use AirOps integrations to read context, notify teams, prepare content for publishing, and coordinate work across your stack.

## Grids

Grids and Playbooks compose for batch work. Add a Playbooks column to a Grid to run a published Playbook for each row.

To add a Playbooks column:

1. Open the Grid.
2. Click **+ Add Column**.
3. Select the **Playbooks** tab.
4. Choose the Playbook.
5. Map Grid columns, static values, or Brand Kits to Playbook Inputs.

If the workspace has no published Playbooks, the Playbooks tab does not have a Playbook to add.

## Slack

Slack supports two separate Playbook use cases:

* Add the native **Slack** Tool when the Playbook needs to read or act on Slack content.
* Connect Slack notifications when people should be notified about triggered runs or Human Review.

### Add the Slack Tool

1. Open the Playbook editor.
2. Open the **Tools** panel and add **Slack**.
3. Select an existing Slack workspace authentication. If the workspace does not have one, connect Slack when prompted.
4. Add Slack to the Playbook, then reference it in the Section that should use it.

The Slack Tool can read channel history and threads, look up users, retrieve files and canvases, and search messages. It can also send channel messages and thread replies, send direct messages, add reactions, and perform supported channel and canvas actions.

State the target channel, thread, user, file, or canvas in the Playbook instructions. For searches, include a query and time range. If a person should approve an outbound message or another Slack change, place a Human Review block before that action.

### Connect Slack notifications

To receive AirOps notifications when a Playbook is triggered or when Human Review is required:

1. Integrate Slack in your AirOps workspace settings.
2. Install the AirOps app in your Slack workspace.

{% hint style="info" %}
Slack notifications do not give a Playbook access to Slack content. Add the native Slack Tool when a Playbook needs to read or act on workspace content.
{% endhint %}

## CMS publishing

Best practice is to keep content creation and CMS publishing as separate steps. Use Playbooks to create, refresh, and review content, then publish from a Grid column, a separate publishing Playbook, or a CMS MCP.

Native CMS publishing options include:

* **Webflow:** Native export. The export pushes the full rich-text field, so custom embeds or tables in that field can be replaced.
* **WordPress:** Direct publishing.
* **Contentful:** Field-level content push.
* **Sanity:** Structured content push.
* **Ghost:** Article publishing.

If you use a CMS MCP or another custom publishing path, call the AirOps MCP `track_aeo_page_content_update` tool after the page is published or refreshed. Pass the page URL and update type. This records the content update in AirOps Insights so you can connect future AI visibility, citation, mention, and traffic changes to the publish event.

{% hint style="info" %}
Images created with the Image Generation tool are hosted. Other images generated or attached during a Session can be local to the Session. For CMS publishing that requires hosted images, use the Image Generation tool, stock image URLs, or add a manual image upload step to your process.
{% endhint %}


# Best Practices

Practical guidance for creating reliable Playbooks

Use these practices to make Playbooks easier to run, review, and improve.

## Start with Brand Kit and Prompt coverage

A current Brand Kit and complete Prompt coverage are the two biggest quality levers. Confirm both before optimizing the Playbook structure.

## Start with less instruction

Give the agent enough direction to understand the goal, then add constraints where you need predictable behavior. Overly prescriptive instructions can reduce the agent's ability to reason through edge cases.

## Organize Sections by phase

Use phases like **Research**, **Draft**, and **Review**. Avoid organizing Sections around people, such as "Strategist Section" or "Editor Section." Phase-based structure is easier to reuse and easier to review.

## Format each Section consistently

Give each Section a predictable internal structure so the agent understands the goal, the reviewer can scan the work, and downstream Sections know which Artifact to use.

A strong Section usually includes:

* **Objective:** One or two sentences that define what this Section should accomplish.
* **Inputs and references:** The Inputs, Artifacts, Brand Kit fields, Tools, or Knowledge Bases the Section should use. Insert these with the slash menu when possible.
* **Instructions:** Numbered steps for the work the agent should perform. Keep these focused on decisions, constraints, and source preferences.
* **Output:** The Artifact the Section should write, plus the required format, such as a Markdown report, JSON map, or final article.

Use the same pattern across Sections. For example, a research Section might state the objective, reference the target prompt and Brand Kit, list the research steps, then write the findings to **AI & Google Results.md**. A drafting Section might reference **Content Outline.md** and **Topic Research.md**, list writing requirements, then write the draft to **Article Draft.md**.

## Use Sections as checkpoints

Add a Section when you need:

* A discrete Artifact.
* A pause for Human Review.
* A clean reference point for later Sections.

## Only write Artifacts when you need persistence

Context carries between Sections automatically. Use Artifacts when an output needs to be stored, shared, or referenced later.

## Reference Knowledge Bases by name

Pick the specific Knowledge Base in the step's Knowledge Base picker. Auto-selection or all-Knowledge-Base search can retrieve from the wrong source.

## Reference Artifacts by name

Artifact names are stable. Filenames can change. Use the slash menu to insert Artifact references by name in downstream Sections.

## Keep publishing separate from content creation

Use Playbooks to create, refresh, review, and prepare content. Publish from a Grid column, a separate publishing Playbook, or a CMS MCP after review. This keeps editorial review, CMS field mapping, and publish tracking easier to control.

When a Playbook or CMS MCP publishes or refreshes a page, use the AirOps MCP `track_aeo_page_content_update` tool with the page URL and update type so AirOps Insights can connect future AI visibility, citation, mention, and traffic changes to that content update.

## Pair opportunity-finding and output-producing Playbooks

Let one Playbook monitor data and find opportunities, then let a separate action Playbook produce the output. This makes each Playbook easier to reason about, review, and iterate.

## Ask Quill to translate Workflow prompts

When you migrate a Workflow, paste the original prompt with full context and ask [Quill](/quill) to translate it into a concise agent instruction. Trim the result from there.

## Keep proposed changes human-reviewed

Well-designed Playbooks suggest changes for human approval instead of applying them automatically when judgment matters. This pattern builds trust, catches edge cases, and keeps stakeholders in the loop.


# Troubleshooting

Troubleshoot common Playbook setup and run issues

Use this guide when a Playbook produces poor output, stalls, routes review incorrectly, or uses the wrong version.

| Symptom                                                | Likely cause                                                                            | Solution                                                                                                       |
| ------------------------------------------------------ | --------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
| Output quality is low                                  | The Brand Kit is stale or uses the legacy format.                                       | Migrate to the new Brand Kit format and audit voice, writing rules, audiences, and regions.                    |
| "Brand Kit required" error after attaching a Brand Kit | The Input type is Text instead of Brand Kit.                                            | Open the Input settings and switch the type to **Brand Kit**.                                                  |
| Playbook misses obvious opportunities                  | Prompt coverage is incomplete or stale.                                                 | Audit tracked Prompts and expand coverage from GSC queries, sales calls, support tickets, and competitor gaps. |
| Knowledge Base search returns irrelevant results       | The wrong Knowledge Base is selected, or auto-selection is searching too broadly.       | Select the Knowledge Base by name in the step's Knowledge Base picker.                                         |
| A downstream Section cannot find an Artifact           | The Section is referencing the Artifact by filename.                                    | Reference the Artifact by name. Use the slash menu to insert the reference.                                    |
| Triggered run uses old Playbook content                | The Trigger is pinned to an older published version.                                    | Open the Trigger and select **Default** or the published version you want to run.                              |
| Triggered run fails after changing Inputs              | The active Playbook version has required Inputs that are not configured on the Trigger. | Open the Trigger settings and update the Input configuration.                                                  |
| Grid run fails after changing Inputs                   | The Grid column is using a Playbook version with required Inputs that are not mapped.   | Open the Grid column settings and update the Input mappings.                                                   |
| Session-chat edits do not update the Playbook          | The Session is running a published version. Chat edits apply to Artifacts only.         | Open the Playbook in the editor and edit the Playbook with [Quill](/quill), or make direct edits.              |
| Replicated Playbook is missing Tools                   | The Workflow converter did not carry every Tool reference into the Playbook.            | Add missing Tools with the slash menu before publishing.                                                       |
| Playbook stalls on Section 1 asking which row to run   | The run is using the internal `__id` column as the row identifier from a Grid.          | Pass a real identifier column, such as URL or slug, to the Playbook instead of `__id`.                         |
| A Playbook is not available in a Grid                  | The Playbook is still a draft.                                                          | Publish the Playbook, then add it from the Grid's Playbooks tab.                                               |
| AEO Insight is not available as a Trigger              | AEO Insight triggers are not enabled for the workspace.                                 | Use Schedule, Webhook, or Monitor, or contact your account team about AEO Insight triggers.                    |
| Webflow export overwrote custom content                | The native export pushes the full rich-text field.                                      | Plan the field structure so the Playbook output owns the field it exports to.                                  |
| Slack messages do not tag individuals                  | Individual @mentions are not supported in Playbook Slack steps yet.                     | Name the person in the message body and have reviewers watch the relevant channel.                             |

## Frequently asked questions

### Can I keep existing Workflows running while I build Playbooks?

Yes. Playbooks and Workflows can run in parallel during migration.

### Do Playbooks support BYOK?

Playbooks do not currently support BYOK. Contact <support@airops.com> if you have questions about model access in Playbooks.

### Can I route reviews to different people based on content type or complexity?

Not natively yet. The current workaround is to create separate Sections with skip logic, such as "If complexity is not 3, skip this Section." Each Section can have its own reviewer assignment.

### Can Playbooks push content directly to my CMS?

Yes, but keep publishing separate from content creation when possible. Create and review the content first, then publish from a Grid column, a separate publishing Playbook, or a CMS MCP. If a Playbook or CMS MCP publishes or refreshes a page, call the AirOps MCP `track_aeo_page_content_update` tool with the page URL and update type so AirOps Insights can track the content update.

### What SEO tools are available in Playbooks?

Playbooks can use AirOps SEO Research, DataForSEO, Moz, Google Search Console, Page 360 Report, and Page Versus Report. They can also use web research tools like Google Search, Parallel Web Systems, Firecrawl, Reddit, and Web Page Scrape.

### How do I trigger a Playbook programmatically?

Use a **Webhook** Trigger. Webhooks are the recommended way to start a published Playbook from an external system. Send a `POST` request to the webhook URL with an `inputs` object that uses Playbook Input variable names as keys. See [Playbook Triggers](/actions/playbooks/triggers#webhook-payload-format) for the payload format. The Trigger runs its selected version: **Default** follows the current published version, and a pinned Trigger keeps using the selected version until you change it. If the Playbook Inputs change, update the Trigger's Input configuration before sending production requests.

### Can Quill edit a Playbook from a running Session?

No. Edits in a Session chat apply to the Artifacts. To modify the Playbook, open it in the editor and use [Quill](/quill) there.

### Can a Playbook remember things across runs?

Yes. Memory persists information across Sessions. A common pattern is a Playbook that monitors data and avoids recommending the same content for refresh within a rolling window, such as 60 days.


# Workflows

Structured, AI-powered content workflows: inputs, steps, variables, outputs. Workflows for step-by-step automation, Grids to run Agents at scale, Playbooks for guided content creation and AEO.

AirOps workflows are the visual builder for structured, AI-powered content workflows, built on four key concepts that work together to automate your marketing and content operations. Use Workflows for step-by-step automation, Grids to run Playbooks and workflows across many pages at scale, and Playbooks for guided content creation, refresh, and optimization. Understanding these basics will help you build effective workflows quickly.

Teams use AirOps workflows for AI content automation across the full funnel, including SEO and answer engine optimization (AEO), content refresh, editorial QA, and internal linking.

* **Workflow Inputs**: The information you feed into your workflow when you start it - like text, files, or selections from dropdown menus. Think of these as the raw materials for your workflow to process.
* **Workflow Steps**: The actions your workflow performs - such as generating text with AI, searching Google, generating an image, or reviewing content. These steps are connected in sequence to accomplish your goal.
* **Workflow Variables**: Values that can be passed between different parts of your workflow. Variables let you use the output from one step as input for another, creating a connected chain of actions.
* **Workflow Outputs**: The final results your workflow produces - whether that's a blog post, image, analysis, or data in a specific format. This is what gets delivered when your workflow finishes running.

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th data-hidden data-card-cover data-type="files"></th></tr></thead><tbody><tr><td><a href="/pages/2zAtwY1TRhkQhbMjUSSO"><strong>Workflow Inputs</strong></a></td><td><a href="/files/ECLfdQZ2IUpnmT4vHhsx">/files/ECLfdQZ2IUpnmT4vHhsx</a></td></tr><tr><td><a href="/pages/eNibdAB9XL8XMOZ8tne0"><strong>Workflow Outputs</strong></a></td><td><a href="/files/weYaXo4SIdKm3JRz70gX">/files/weYaXo4SIdKm3JRz70gX</a></td></tr><tr><td><a href="/pages/CbV3x2p0MtHJOX8G6tfI"><strong>Workflow Steps</strong></a></td><td><a href="/files/4bgJVDVGN5OdzqeohF3C">/files/4bgJVDVGN5OdzqeohF3C</a></td></tr><tr><td><a href="/pages/6vpRYrCy6FoOpFIE5SeG"><strong>Workflow Variables</strong></a></td><td><a href="/files/duZCfCfSmOdZW9oA1fAz">/files/duZCfCfSmOdZW9oA1fAz</a></td></tr></tbody></table>


# Workflow Inputs

Define the UI and API input values for your Workflows

How to Add Input Variables

Workflow Inputs are variables you can set at runtime and use inside of your Workflows.

### 1. Click the **"Configure"** button on your Start step

<figure><img src="/files/ECLfdQZ2IUpnmT4vHhsx" alt=""><figcaption><p>Click on "Set Inputs" to define your inputs</p></figcaption></figure>

### 2. Select your input type

You will be prompted to first choose your desired **"Input Type."** This determines both the user interface and the data type of your input value:

<figure><img src="/files/fZ3SOjUabn0SqVvHF9bN" alt=""><figcaption></figcaption></figure>

### 3. Customize the input field

See the [next section](#input-types) for a full list of supported types to decide what works best for your use-case. Continue to populate the remaining fields of your Workflow Input:

<figure><img src="/files/PNhBeKDZgwHqx9ytRfRj" alt="" width="563"><figcaption></figcaption></figure>

* **Label:** a descriptive label for the name of your input
* **Variable Name:** the name of your input as a variable, which will be referenced as liquid syntax in your steps. By default, the variable name is automatically generated when you add a label, but it can be customized to be separate
* **Hint:** helper text that appears below your input on the Workflow page
* **Placeholder:** example value that will be overwritten by your input value
* **Default Value:** a default value used if no other input value is provided, this is useful for API calls
* **Required:** determines whether or not the input is required for your Workflow to run successfully

{% hint style="info" %}
**Inputs are required by default.** When you create a new input, it is automatically set as required. This saves you one click per input when building workflows. You can uncheck the "Required" option if you want to make an input optional.
{% endhint %}


# Input Types

Choosing the correct input type is important for the success of your Workflow.

### Basic Input Types

Basic input types allow users to type information or select options from a dropdown:

* **Short Text:** A single-line text field
* **Long Text:** A multi-line text field
* **Single Select:** Allows the user to choose one option from a list
* **Multi Select:** Allows the user to choose multiple options from a list

### Advanced Input Types

Advanced input types allow users to pass in JSON, files, databases, or numbers as inputs:

{% hint style="danger" %}
Workflows with file inputs cannot be published as public Workflows
{% endhint %}

* **JSON:** Allows the user to pass a JSON object or list
* **File Text:** Allows the user to upload a .pdf, .txt, .docx, .md file that is converted into text
* **File Media:** Allows the user to upload a .mp3, .mp4, .wav, .jpg, .png, .webp file which is converted into a downloadable link
* **File CSV:** Allows the user to upload a .csv file which is transformed into a list of JSON objects
* **Data Sources:** Allows the user to connect to a [data source](/context/memory-stores/add-data/import-from-sql-database/data-sources) that has been added in AirOps
* **Number:** Allows the user to pass a numerical string that is interpreted as a number instead of a string

{% hint style="warning" %}
If you input a number using Short Text or Long Text, it will be interpreted as a string - e.g. 3 will be interpreted as "3". Instead, use the **Number** input type to pass a number.
{% endhint %}

### AirOps-Specific Input Types

AirOps-specific input types provide access to additional platform features:

* **Brand Kit:** Allows you to choose a Brand Kit as an input and reference any of its attributes throughout the workflow. Brand Kits include:
  * **Foundations**: Core brand identity, tone of voice, and global writing rules
  * **Product Lines**: Different products or services with their own context and competitors
  * **Content Types**: Content formats with outlines, samples, and format-specific rules
  * **Audiences**: Target segments with descriptions and audience-specific writing rules
  * **Regions**: Markets with localization settings and region-specific writing rules
  * **Example:** A content creation workflow that adapts messaging based on the selected product line, tailors the tone for a specific audience (e.g., Enterprise vs. SMB), and outputs in the correct language for a target region
* **Knowledge Base:** Allows you to dynamically set a knowledge base upfront and reference it throughout the workflow
  * **Example:** An internal linking workflow that recommends relevant page connections based on different sitemaps, allowing content teams to optimize SEO by connecting related content across various sections of a website

### Input Specifications

Detailed specifications on the input types and resulting data types:

<table><thead><tr><th width="174">Input Name</th><th width="158">Input Type</th><th width="212">Resulting Data Type</th><th>Use Cases</th></tr></thead><tbody><tr><td>Short Text</td><td></td><td>String</td><td></td></tr><tr><td>Long Text</td><td></td><td>String</td><td></td></tr><tr><td>Single-Select</td><td></td><td>String</td><td>Allow the user to select one option</td></tr><tr><td>Multi-Select</td><td></td><td>String</td><td>Allow the user to select multiple options</td></tr><tr><td>JSON</td><td>JSON or List</td><td>JSON or List</td><td>Create an API that accepts a JSON payload</td></tr><tr><td>File Text</td><td>.pdf, .txt, .docx, .md</td><td>String</td><td>Generate summaries or insights from PDFs</td></tr><tr><td>File Media</td><td>.mp3, .mp4, .wav, .jpg, .png, .webp</td><td>Downloadable link to file</td><td>Transcribe and analyze interviews</td></tr><tr><td>File CSV</td><td>.csv</td><td>A list of JSON objects</td><td>Iterate over each row of a csv and analyze the results</td></tr><tr><td>Database</td><td></td><td>Database</td><td>Run a query on your database</td></tr><tr><td>Number</td><td></td><td>Number</td><td></td></tr><tr><td>Brand Kit</td><td></td><td>Single Select or ID</td><td></td></tr><tr><td>Knowledge Base</td><td></td><td>Single Select or ID</td><td></td></tr></tbody></table>

*Please note: Files do not have a specific size limit, but large files could impact upload time and server load.*


# Workflow Steps

AirOps Workflow Steps: the building blocks for structured, AI-powered workflow automation — AI, SEO, and answer engine optimization (AEO), content quality, code, data, and CMS integration steps.

<figure><img src="/files/4bgJVDVGN5OdzqeohF3C" alt="" width="375"><figcaption></figcaption></figure>

## Workflow Steps

Workflow Steps are the building blocks of automation in AirOps and the core of its workflow automation features. They provide a toolkit for creating structured, AI-powered workflows that connect data, services, and content generation, including full-funnel content workflows that scale across large content teams.

AirOps offers a diverse range of step categories, each designed to address specific needs in your automation journey:

1. **AI Steps** -- Leverage cutting-edge AI models for text generation, image creation, and audio transcription
2. **Web Research Steps** -- Gather intelligence from search engines and websites to power your research
3. **Code Steps** -- Add custom logic, make API calls, and manipulate data with flexible coding capabilities
4. **Flow Steps** -- Control workflow execution with conditions, iterations, and human review checkpoints
5. **Data Steps** -- Search, retrieve, and store information in AirOps Knowledge Bases and Grids
6. **AirOps Steps** -- Reference existing Workflows and Agents to build more complex applications
7. **Image & Video Steps** -- Generate and manipulate visual content for your marketing and communication needs
8. **SEO Research Steps** -- Retrieve valuable search intelligence from leading SEO platforms
9. **Content Quality Steps** -- Verify content originality and detect AI-generated text
10. **Content Processing Steps** -- Transform and organize content between different formats and structures
11. **B2B Enrichment Steps** -- Access company and contact data to enhance your business operations
12. **CMS Integrations** -- Connect directly with CMS applications and services to extend your workflows
13. **Analytics Integrations** -- Connect directly with external applications and services for analytics to use in your workflows
14. **Collaboration Integrations** -- Connect directly with external applications and services you can use for collaboration.

These step categories can be combined in countless ways to automate complex processes, from content generation, SEO, and answer engine optimization (AEO) to content refresh, editorial QA, lead enrichment, and data transformation. The visual workflow editor makes it easy to connect steps together, creating powerful automation that saves time and improves quality.

{% hint style="info" %}
Note: The availability of certain steps may vary depending on your subscription plan. Some steps are designed specifically for Workflows and may have limited functionality when used in Agents.
{% endhint %}


# AI

Utilize the latest in AI in your Workflows

AI Steps are the most powerful tools at your disposal when developing Workflows. AirOps currently supports the following AI Steps:

1. [**Prompt LLM**](/actions/workflow-concepts/workflow-steps/ai-steps/llm)**:** understand and generate responses based on customized inputs
2. [**Transcribe Audio File**](/actions/workflow-concepts/workflow-steps/ai-steps/transcription)**:** parse and transcribe audio or video files into text

As the AI field continues to quickly develop, we're eager to continue expanding these offerings. In the meantime, we'd love to hear your feedback as you start to explore each AI Step in detail!

{% hint style="info" %}
Note: AI Steps are only available for Workflows. They are not available for Agents at this time.
{% endhint %}


# Prompt LLM

The AirOps LLM step: prompt models from OpenAI, Anthropic, and Google (or your own keys) with prompt engineering, structured outputs, and MCP tool access.

Large Language Models (LLMs) are a category of machine learning models that generate human-like text. They are trained on extensive amounts of data and are capable of understanding and generating responses based on given inputs as well as powering conversational experiences

In AirOps, the LLM step lets you prompt models from OpenAI, Anthropic, and Google (or your own model keys), with control over prompt engineering, temperature, structured outputs, and MCP tool access.

We started AirOps to make it easier to build powerful solutions with these models as they play a growing role in business operations.

## Setting up an LLM Step

When setting up an LLM Step, there are multiple parameters to configure to best fit your use-case. We'll provide a brief overview of each parameter here.

<figure><img src="/files/AT8YCqaZ1AAs68L1kGkl" alt=""><figcaption></figcaption></figure>

### Select an AI Model

Selecting a model depends on context window, task complexity, cost, and speed. Generally, more capable models offer higher quality output at a higher cost and slower speed.

For guidance on which model to select, check out our doc page on [Choosing a Model](/actions/workflow-concepts/workflow-steps/ai-steps/llm/choosing-a-model).

{% hint style="info" %}
You can also choose to bring your own fine-tuned model by connecting it via our [API Providers](/your-workspace/team#api-providers) page.
{% endhint %}

<figure><img src="/files/ATg59MGKwAnxvqXgzQBt" alt=""><figcaption></figcaption></figure>

### MCP Connectors

MCP Connectors give the LLM access to external tools hosted on [Model Context Protocol](https://modelcontextprotocol.io/) servers. When connectors are selected, the model can call those tools during execution to fetch data, trigger actions, or interact with third-party services.

#### Supported Models

MCP Connectors are available with the following models:

| Provider  | Supported Models                                                                                                            |
| --------- | --------------------------------------------------------------------------------------------------------------------------- |
| OpenAI    | gpt-4o, gpt-4o-mini, gpt-4.1, gpt-4.1-mini, gpt-5, gpt-5.1, gpt-5.2, gpt-5-mini, gpt-5-nano, o3, o3-pro, o4-mini, and newer |
| Anthropic | Claude Sonnet 4, Claude Opus 4, Claude Haiku 4.5, and newer                                                                 |

{% hint style="warning" %}
The MCP Connectors dropdown only appears in the LLM step when a compatible model is selected. If you don't see the option, switch to one of the supported models listed above.
{% endhint %}

#### Selecting Connectors

When a supported model is selected, an **MCP Connectors** dropdown appears in the step configuration. Select one or more connectors to make their tools available to the model.

<figure><img src="/files/mpGY4Oq6yWxpPnF1SVnJ" alt=""><figcaption><p>MCP Connectors dropdown in the LLM step</p></figcaption></figure>

#### How It Works at Runtime

1. AirOps passes the selected connectors as available tools to the LLM API.
2. The LLM decides whether to call any tools based on the prompt and conversation context.
3. When the LLM calls a tool, AirOps routes the request to the corresponding external MCP server.
4. The MCP server processes the request and returns a response.
5. The response flows back to the LLM, which incorporates it into the final answer.

The LLM may call multiple tools in a single step execution, and it may choose not to call any tools if they are not relevant to the prompt.

#### Viewing MCP Tool Calls in Traces

When an LLM step uses MCP Connectors, the step trace logs each tool call with its inputs and outputs. This makes it easy to debug and understand how the model interacted with external tools.

<figure><img src="/files/2eyY55eIp5jnfeMWX9hu" alt=""><figcaption><p>Step trace showing MCP tool call inputs and outputs</p></figcaption></figure>

{% hint style="info" %}
To add or manage MCP Connectors for your workspace, go to **Settings > MCP Connectors**. See the [MCP Connectors setup guide](/developers/mcp-connectors) for details.
{% endhint %}

### Temperature

Temperature determines the amount of variability in the AI's response:

* For greater variability and more "creative" responses, choose a higher temperature.
* For less variability and more deterministic responses, choose a lower temperature.

### Max Length (optional)

Limits the maximum number of output tokens. If left empty no limits are enforced.

<figure><img src="/files/d3mTzlq3wzGzUxJpZ0J0" alt=""><figcaption></figcaption></figure>

### Streaming

Streaming allows you to see output generated token-by-token, similar to the ChatGPT experience. The text will stream in the Test panel of the Workflow Studio or when you run your Workflow in AirOps.

**Reasons for Streaming:**

* **Rapidly test prompts:** If you want to test prompts quickly, you can watch your output generate in real-time and validate your prompt faster instead of waiting for the entire response to finish.
* **Deliver an API with streaming:** If streaming text in real-time is a better user-experience for your end-user, you should consider streaming as an option. On the other hand, if you're generating large amounts of text, perhaps streaming is not the ideal option for your end-user.
* **AirOps Frontend SDK:** Our SDK makes it possible for you to stream Workflow outputs directly into your user experience

### Output Format

For OpenAI models, you can choose between "Text" (default) and "JSON".

If you choose JSON, then the LLM step will always return its output in a valid JSON format. You should specify in your prompt what JSON output format you want the LLM to follow. For example if you want the JSON to include keys like "title" and "content", you should specify in in the prompt.

### Structured Outputs

For OpenAI models, when specifying a JSON output format, you can also use the "Define Column Outputs" option to specify the format the JSON will follow. This is a more formal specification than just writing down how you want the output format to be in your prompt. But it is also more limited. Right now you can only use Structured Outputs for a flat JSON with top level keys and no arrays.

### Consistent Results

Enabling the "Request Consistent Results" will request that the model make a best effort attempt to achieve consistent output results given the same input multiple times.

This can be useful for testing purposes, as maintaining consistency in results is often a requirement as you test the broader workflow.

The "Request Consistent Results" feature is only available for OpenAI models.

### Prompt Your Model

Once you've completed selecting your model and choosing the desired parameters, the next big step is to provide it with a prompt. Prompts should be as thorough and descriptive as possible, and we recommend referencing our doc pages on how best to "[Prompt with GPT](/actions/workflow-concepts/workflow-steps/ai-steps/llm/prompt-with-gpt)" and "[Prompt with Claude](https://github.com/airopshq/airops-docs/blob/main/building-workflows/workflow-steps/ai-steps/llm/broken-reference/README.md)."

We also encourage you to look through our suite of existing Templates. Nearly all of them include an LLM Step, and can help give some inspiration and guidelines for what your prompt may look like, e.g.

#### User Prompt

The "User Prompt" field provides the model with sample inputs or conversation to get the desired output, e.g.

```
User: 
Please write an exciting poem targeted toward kindergarten students with the following:
Poem Title: The First Day of School
Topics: Recess, Art Class, Snack Time
```

#### Assistant Prompt

The assistant prompt helps the model "learn" the desired output format. This is especially helpful to generate arrays, JSON, or HTML without extra "chat" text (*"Sure! This is an array..."*), e.g.

```
System: You output an array of 5 strings with nouns that are kitchen objects.

User: Give me an output of 5 utensils

Assistant: ["spoon", "fork", "knife", "spatula", "chopsticks"]

User: Now, give me an array of 5 {{my_input}}
```

{% hint style="info" %}
In AirOps, you can include multiple User / Assistant pairs in order to give the LLM examples of how to respond.
{% endhint %}

## How to continue if the LLM step fails

By default, the LLM step will terminate the workflow if it fails. However, to continue the workflow if the step fails, simply click on the Settings and click `Continue` at the bottom of the Settings:

<figure><img src="/files/LElUzr0kPhUdsYaSDTb3" alt=""><figcaption><p>Click Continue at the bottom of the LLM Step</p></figcaption></figure>

The step will return the following keys:

* `output` : this will be `null`
* `error` :
  * `message`: the message returned from the step
  * `code` : the error code representing the error

<figure><img src="/files/o0zPkVk5AuQbsnsftFzR" alt="" width="563"><figcaption></figcaption></figure>

## How to retry if the LLM step fails

To retry the LLM step if it fails,

1. Select `Continue` instead of `Terminate Workflow` if the step fails
2. Add a conditional where the condition checks if the `error` from the step exists e.g. `step_1.error`
3. Add the step that you want to retry if there was an error

<figure><img src="/files/IMUoF6p5vnc1tKpClx2m" alt="" width="563"><figcaption></figcaption></figure>

## Generate Prompt with AI

When configuring your LLM Step, you can use our "Generate with AI" tool to assist you in filling in the prompt:

<figure><img src="/files/fgLS6ilzzBBFe6WmSLXw" alt=""><figcaption></figcaption></figure>

We'll provide a quick breakdown of each of the customizable options that come with this feature, and share a walkthrough example below.

{% hint style="info" %}
Note: "Generate with AI" is currently only compatible with OpenAI
{% endhint %}

### Task Type

You first have to define your Task Type. The list of currently supported types includes:

1. **Content Creation** -- a good choice if you are looking to generate content, e.g. a blog post, an image, a marketing email, etc.
2. **Question + Answer** -- choose this option if you plan for your input to be a question and your output to be the answer
3. **Entity Extraction** -- choose this option if you're looking to extract specific values from a text or image
4. **Text Extraction** -- similar to Entity Extraction, this can be useful for parsing out specific text values
5. **Classification** -- choose this option if you would like for your output to group different values of your input into similar categories

### Output Type

Once you've defined your Task Type, the next decision to make is how you would like the LLM Step to output the results. The list of currently supported Output Types includes:

1. Plain Text
2. Markdown
3. HTML
4. JSON
5. YAML

By selecting a value here, you can save yourself the additional effort of specifying the output type in your prompt (or requiring a subsequent Text Step to reformat the output)

### Prompt

The Prompt section is similar to what we covered earlier in ["Prompt Your Model."](#prompt-your-model) However, the key difference here is that we can rely on our AI to flesh out the description further. So, if you were unsure of exactly how to phrase your prompt, OpenAI will attempt to expand upon it.

### Advanced Settings

* **Output Example (optional)** -- if the AI is struggling to output the results in the specified format, you can manually enter an example here for it to work from. This is similar to the User/Assistant Prompts above.
* Selected Variables -- populates with any input variables you have leading into the step

### Example

As an example, let's walk through using the "Generate with AI" feature to help create a basic Workflow. We'll imitate the Restaurant Review we created in our [Workflow Quick Start](https://github.com/airopshq/airops-docs/blob/main/building-workflows/workflow-steps/ai-steps/llm/broken-reference/README.md).

{% @arcade/embed url="<https://app.arcade.software/share/wwLuvhmlXoRTKETSBYPy>" flowId="wwLuvhmlXoRTKETSBYPy" %}


# Model Selection Guide

Compare supported models and choose one for a Prompt LLM step

## Choose a Model

The model you select affects output quality, speed, cost, and the features available in a [Prompt LLM step](/actions/workflow-concepts/workflow-steps/ai-steps/llm). Use the model picker as the source of truth for availability in your workspace.

<figure><img src="/files/WeO3yzOwbMYFOCYhvRGc" alt=""><figcaption></figcaption></figure>

### What to Consider <a href="#what-to-consider" id="what-to-consider"></a>

Compare these factors before selecting a model:

1. **Context window:** Check how much input the model can process. One token is roughly four characters in English.
2. **Task complexity:** Use stronger reasoning models for planning, analysis, and multi-step logic.
3. **Web access:** Confirm that the model supports web research when the task needs current information.
4. **Cost:** Compare the model's cost tier in the picker, especially for high-volume Workflows.
5. **Speed:** Balance response time against the reasoning depth the task requires.

## Common AirOps Models

The following models cover common use cases in new Workflows. A checkmark means the capability is available in the AirOps Prompt LLM step.

| Model                  | Provider   | Description                                                 | Context Window | Vision | JSON Mode | Web Access |
| ---------------------- | ---------- | ----------------------------------------------------------- | -------------- | ------ | --------- | ---------- |
| GPT-5.6 Sol            | OpenAI     | Flagship GPT-5.6 model for complex reasoning and coding     | 1M             | ✓      | ✓         | ✓          |
| GPT-5.6 Terra          | OpenAI     | Balanced GPT-5.6 model for strong performance at lower cost | 1M             | ✓      | ✓         | ✓          |
| GPT-5.6 Luna           | OpenAI     | Cost-efficient GPT-5.6 model for high-volume workloads      | 1M             | ✓      | ✓         | ✓          |
| GPT-5.5                | OpenAI     | Previous flagship for complex reasoning tasks               | 1M             | ✓      | ✓         | ✓          |
| GPT-5.4                | OpenAI     | Advanced model for professional work                        | 1M             | ✓      | ✓         | ✓          |
| GPT-5.4 Mini           | OpenAI     | Faster GPT-5.4 model for well-defined tasks                 | 400K           | ✓      | ✓         | ✓          |
| GPT-5.4 Nano           | OpenAI     | Cost-efficient GPT-5.4 model for lightweight tasks          | 400K           | ✓      | ✓         | ✓          |
| GPT-5.2                | OpenAI     | Flagship with enhanced long-context reasoning               | 400K           | ✓      | ✓         | ✓          |
| GPT-5.1                | OpenAI     | Model for coding and agentic tasks                          | 200K           | ✓      | ✓         | ✓          |
| GPT-5                  | OpenAI     | Model for complex tasks                                     | 200K           | ✓      | ✓         | ✓          |
| O3 Pro                 | OpenAI     | Advanced model for complex reasoning                        | 200K           | ✓      | ✓         | -          |
| O3                     | OpenAI     | Reasoning model with web research                           | 200K           | ✓      | ✓         | ✓          |
| Claude Opus 5          | Anthropic  | For complex agentic coding and enterprise work              | 1M             | ✓      | -         | ✓          |
| Claude Fable 5         | Anthropic  | Demanding reasoning and long-horizon agentic work           | 1M             | ✓      | -         | ✓          |
| Claude Sonnet 5        | Anthropic  | Hybrid reasoning for fast answers or deep thinking          | 1M             | ✓      | -         | ✓          |
| Claude Opus 4.8        | Anthropic  | Previous flagship for complex multi-step tasks              | 1M             | ✓      | -         | ✓          |
| Claude Opus 4.7        | Anthropic  | Complex reasoning, coding, and long-context work            | 1M             | ✓      | -         | ✓          |
| Claude Opus 4.6        | Anthropic  | Complex reasoning and coding                                | 200K           | ✓      | -         | ✓          |
| Claude Sonnet 4.6      | Anthropic  | Current Sonnet option for complex tasks                     | 200K           | ✓      | -         | ✓          |
| Claude Haiku 4.5       | Anthropic  | Fast model for lightweight tasks                            | 200K           | ✓      | -         | ✓          |
| Gemini 3.5 Flash       | Google     | Fast model with Google Search grounding                     | 1M             | -      | ✓         | ✓          |
| Gemini 3.1 Pro Preview | Google     | Advanced reasoning with Google Search grounding             | 1M             | -      | ✓         | ✓          |
| Gemini 3 Flash Preview | Google     | Fast model for lightweight tasks                            | 1M             | -      | ✓         | ✓          |
| Gemini 3.1 Flash Lite  | Google     | Cost-efficient model for lightweight tasks                  | 1M             | -      | ✓         | ✓          |
| Perplexity Sonar       | Perplexity | Balanced model for online web research                      | 128K           | -      | -         | ✓          |

## OpenAI Models

### GPT-5 Series

GPT-5 models combine reasoning with general-purpose generation. GPT-5.6 appears in the model picker as Sol, Terra, and Luna. AirOps selects GPT-5.6 Sol by default for new Prompt LLM steps.

Reasoning controls vary by model:

* GPT-5 supports `minimal`, `low`, `medium`, and `high`.
* GPT-5.1, GPT-5.2, GPT-5.4, GPT-5.5, and GPT-5.6 support `none`, `low`, `medium`, and `high`.

### O3 Models

Use O3 for complex, multi-stage reasoning. O3 supports `low`, `medium`, and `high` reasoning levels. O3 Pro increases reasoning capability but does not support web research in the Prompt LLM step.

## Differences between Claude Models

### Claude Opus 5

Claude Opus 5 handles complex agentic coding and enterprise work. Turn on **Enable Thinking** in the Prompt LLM step when the task benefits from additional reasoning. Claude Opus 5 supports **Web Research**, but it does not support **Web Fetch**.

### Claude Fable 5

Claude Fable 5 supports demanding reasoning and long-horizon agentic work.

### Claude Sonnet 5

Claude Sonnet 5 balances fast responses with deeper reasoning and is starred in the LLM model picker.

### Claude Opus 4.8 and 4.7

Claude Opus 4.8 and 4.7 support complex, multi-step Workflows, long-form content, and research tasks. Both models support 1M-token context windows.

### Claude Sonnet 4.6 and Haiku 4.5

Use Claude Sonnet 4.6 for complex tasks that need a balance of reasoning and speed. Use Claude Haiku 4.5 for lighter workloads.

## Model Availability

AirOps hides deprecated models from the picker for new Workflows. If an existing Workflow uses a deprecated model, the selected model remains visible so you can review the change. AirOps may automatically update the selection to a supported model when the Workflow loads.

Review the selected model and test the Workflow after an automatic update. Model behavior, cost, and supported settings can change between versions.

{% hint style="warning" %}

* Claude Opus 4.1 is deprecated and scheduled for removal on August 5, 2026. Select Claude Opus 4.8 or another current model and test affected Workflows before the removal date.
* Gemini 2.5 Pro and Gemini 2.5 Flash are deprecated and scheduled for removal on October 16, 2026. Select a current model from the picker and test affected Workflows before the removal date.
  {% endhint %}

## Web Search Capabilities

Several models support web research, allowing them to access current information during generation:

**OpenAI:** GPT-5, GPT-5.1, GPT-5.2, GPT-5.4, GPT-5.4 Mini, GPT-5.4 Nano, GPT-5.5, GPT-5.6 Sol, GPT-5.6 Terra, GPT-5.6 Luna, and O3 support web research when enabled in the Prompt LLM step.

**Anthropic:** Current Claude models support web research. Web Fetch availability depends on the selected model. Claude Opus 5 supports **Web Research**, but not **Web Fetch**.

**Google:** Current Gemini models support web research through Google Search grounding.

**Perplexity:** Sonar models include web access for online research.

## How much will it cost to run?

The cost to run a model depends on the number of input and output tokens.

### Token Approximation

**Input tokens:** to approximate the total input tokens, copy and paste your system, user, and assistant prompts into [the OpenAI tokenizer](https://platform.openai.com/tokenizer)

**Output tokens:** to approximate the total output tokens, copy and paste your output into [the OpenAI tokenizer](https://platform.openai.com/tokenizer)

### Cost Approximation

**OpenAI:** divide the input and output tokens by 1000; then multiply by their respective costs [based on OpenAI pricing](https://openai.com/pricing)\*

**Anthropic:** divide the input and output tokens by 1,000,000; then multiply by their respective costs [based on Anthropic pricing](https://www-cdn.anthropic.com/files/4zrzovbb/website/31021aea87c30ccaecbd2e966e49a03834bfd1d2.pdf)\*

{% hint style="info" %}
\*This is the cost if you [bring your own API Key](/your-workspace/settings/byo-key). If you choose to use AirOps hosted models, you will be [charged tasks according to your usage](https://airopshq.notion.site/AirOps-Task-Pricing-by-Hosted-Service-fd825db1300545cb8c3b5de8bc16529e).
{% endhint %}


# Prompting Guide

How to prompt with GPT

## Getting Started by Generating Prompts with AI

The **Generate with AI** feature allows users to scaffold a prompt with natural language.

Simply click **Generate with AI**, choose the type of your task, and describe what you're looking to accomplish. Check out this guide to get started:

{% embed url="<https://www.youtube.com/watch?v=FI2T6SzuOlw>" %}

## What is the System message?

The system message defines the AI's persona, objective, specific tasks or rules.

*Note: this definition varies from user-to-user and prompt-to-prompt. Too many System message instructions, and the output may degrade - so feel free to experiment by adding the instructions in the User prompt!*

```
System Message Example: 
You are a renowned poet. 
You write poems in the tone and style of Dr. Seuss.
Only include topics appropriate for children.
```

## How do I decide what goes in the System message?

There are no hard rules about what to include in the system prompt. However, we generally recommend including specific, well-defined tasks while avoiding extremely complex logic.

## What is the User and the Assistant messages?

The user and assistant define the conversation between you (the user) and the AI (the assistant).

For example, in a conversation between you and chatGPT: your message is the "User" message and chatGPT's response is the "Assistant" response.

{% hint style="info" %}
Using both the User and Assistant allows you to provide examples that help the model "learn" your desired output format (JSON, HTML, etc) and language
{% endhint %}

## How do I prompt with the User and Assistant?

### How to Prompt with a User-Assistant Pair

User-Assistant pairs (also known as one-shot or few-shot prompting) are examples we provide to the model to help it "learn" our desired response:

1. Add an example **User** message
2. Add the expected **Assistant** response
3. *(optionally) Add more user-assistant pairs*
4. Add another **User** message with your input

For a detailed guide, check out our tutorial on K-Shot Prompting:

{% embed url="<https://www.youtube.com/watch?v=NBpAPwl4Yx0>" %}

### Text Extraction Example

> **System:** Your task is to extract the unique transcript ID from the end of the URL.
>
> **User:** <https://app.fireflies.ai/view/AirOps-Intro::DkMo5PetdLeCDglp>
>
> **Assistant:** DkMo5PetdLeCDglp
>
> **User:** <https://app.fireflies.ai/view/Mdei9OrqpQlWIijd>
>
> **Assistant:** Mdei9OrqpQlWIijd
>
> **User:** {{link\_to\_sales\_call}}

### Why use more than one User-Assistant pair?

Using more than one example is helpful for nuanced logic.

In our text extraction example, we provided two URL's with different formats to help the model understand how to extract text under multiple scenarios.

{% hint style="success" %}
**Use a real-life example:** The best way to generate high-quality outputs is by providing a high-quality example to the model. Use the most realistic example when possible, whether from the internet or from your own data.
{% endhint %}

## How do I use LLMs that have vision capabilities in AirOps?

Some LLMs, such as GPT-4o, have vision capabilities. To use these vision capabilities in AirOps, you need to provide a link of a downloadable image to the model:

### How to Configure the LLM Step

1. Add an **LLM** step to your workflow
2. Change the model to **GPT-4o**
3. Add an **Image URL** to the User message where it says "Add an Image URL"

### How to pass an image from a User Upload

1. To upload a single image from your desktop, change the input type to **File Media** which accepts a .jpg, .png, or .webp file
2. AirOps will return a downloadable URL to this image
3. Pass the input as liquid syntax to GPT-4o where it says "Add an Image URL"

### How to pass an image from Google Drive

1. To upload an image from Google Drive, choose **Short Text** as an input type
2. Change the Google Drive image so anyone with the link can view it
3. Add a code step to transform the Google Drive link into a downloadable URL replacing `short_text_input` with the name of your input:
   * ```
     const fileID = short_text_input.match(/[-\w]{25,}/);

     return `https://drive.google.com/uc?export=download&id=${fileID[0]}&confirm=t`
     ```
4. Pass the output of the previous step into GPT-4o where it says "Add an Image URL"

For a more detailed guide on GPT-4o, check out our tutorial here:

{% embed url="<https://www.youtube.com/watch?v=BCoZhI4Gem8>" %}


# Transcribe Audio File

Transcribe audio or video files into text

## How to Configure the Transcription Step

When configuring a Transcription Step, there are two main pieces to consider:

1. Selecting the best transcription model for your use-case
2. How to pass your audio file to AirOps

Once you're ready to get started, you can click the "Configure" button of your Transcription Step to set these values.

{% @arcade/embed url="<https://app.arcade.software/share/zw6zMG4DZf8rLDhjlrPC>" flowId="zw6zMG4DZf8rLDhjlrPC" %}

### **Transcription Model**

AirOps offers the following transcription models:

* [**Deepgram Whisper Large**](https://deepgram.com/learn/improved-whisper-api)**:** fast, reliable transcription that includes built-in diarization (speaker identification). With the ability to auto detect language or set the language [code](https://developers.deepgram.com/docs/languages-overview)
* [**Deepgram Nova**](https://deepgram.com/learn/nova-speech-to-text-whisper-api)**:** the fastest model to-date
* [**Deepgram Nova 2**](https://deepgram.com/learn/nova-2-speech-to-text-api)**:** provides the best overall value
* **Deepgram Nova 3:** Deepgram's latest Nova model. Choose Nova 3 when you want the highest transcription accuracy from Deepgram and can accept slightly higher latency than Nova 2.
* [**Deepgram Enhanced**](https://deepgram.com/changelog/introducing-new-enhanced-model)**:** higher accuracy and better word recognition. With the ability to auto detect language or set the language [code](https://developers.deepgram.com/docs/languages-overview)
* [**AssemblyAI**](https://www.assemblyai.com/blog/conformer-2/)**:** With the ability to select the number of speakers expected in a transcript, AssemblyAI is an excellent choice for diarization

{% hint style="warning" %}
Keep in mind: Deepgram has a **2GB** file size limit and AssemblyAI has a **5GB** file size limit
{% endhint %}

### Adding Your File into AirOps

There are currently two methods for passing your audio or video files into AirOps.

#### Option #1: Upload via the AirOps UI

* In the `Start Step` of your Workflow, define your Workflow Input as "File Media"
* Add the **input** as the `File to transcribe`

{% @arcade/embed url="<https://app.arcade.software/share/T7L31xTdI3bTIzyQIFL4>" flowId="T7L31xTdI3bTIzyQIFL4" %}

#### Option #2: Upload via Google Drive

* Within Google Drive, configure your audio or video file so that "Anyone with the link" can view:

<figure><img src="https://files.readme.io/cc901be-image.png" alt="" width="375"><figcaption></figcaption></figure>

* Add an **input** with the variable name `google_drive_link`
* Add a **code step** with the following Javascript to convert the shareable URL from Google Drive into a downloadable URL:
* <pre><code><strong>const fileID = google_drive_link.match(/[-\w]{25,}/);
  </strong>
  return `https://drive.google.com/uc?export=download&#x26;id=${fileID[0]}&#x26;confirm=t`
  </code></pre>
* Add the *output of the code step* as the `File to transcribe`

{% @arcade/embed url="<https://app.arcade.software/share/taddcde90KVBzgX6iSJA>" flowId="taddcde90KVBzgX6iSJA" %}

### Multiple Speakers?

If selected, the model will automatically detect multiple speakers. This will result in the following outputs from the model.

> Speaker 0:
>
> Speaker 1:
>
> Speaker 0:

> Speaker A:
>
> Speaker B:
>
> Speaker A:

{% hint style="info" %}
Only AssemblyAI allows you to select the # of expected speakers. Without selecting # of speakers, the transcription may detect more (or fewer) speakers than expected
{% endhint %}

### Detect Language?

Check to automatically detect the language of the file

### Language

If `Detect Language?` is unchecked, you can specify the language you want to detect.

{% hint style="danger" %}
Not all models support multiple languages. Check out the documentation of each model below to determine which languages are supported
{% endhint %}

{% embed url="<https://developers.deepgram.com/docs/languages-overview>" %}

{% embed url="<https://www.assemblyai.com/docs/concepts/supported-languages>" %}


# Web Research

Web Research Steps provide powerful tools to gather and extract information from across the internet. These capabilities form the foundation for data-driven content creation, market research, and competitive analysis in your workflows.

The Web Research Steps include:

1. [**Google Search**](/actions/workflow-concepts/workflow-steps/web-research/google-search) -- automate Google searches and retrieve structured search results
2. [**Web Page Scrape**](/actions/workflow-concepts/workflow-steps/web-research/web-page-scrape) -- extract content from websites in various formats including text, markdown, and HTML

Web Research Steps allow you to automate information gathering that would typically require manual browsing and copying. By programmatically accessing search results and website content, you can build workflows that continuously monitor topics, gather competitive intelligence, compile research for content creation, and maintain up-to-date information without manual intervention.

These steps can be combined with other AirOps capabilities like LLM Steps to analyze search results, extract key insights, and transform raw web content into structured, actionable information.

{% hint style="info" %}
Note: When using Web Research Steps, be mindful of website terms of service and copyright considerations. These steps are designed for legitimate business research purposes.
{% endhint %}


# Google Search

Automate research with a Google Search

The "Google Search" Step allows you to automate a Google Search and pass the results as input into your Workflows.

## Configuring a "Google Search" Step

Configuring the step is straightforward with simple dropdown menus. No JSON payload required.

<figure><img src="/files/EkhYoJWHfAujHsQKsmV7" alt=""><figcaption></figcaption></figure>

### Search Query

The "Search Query" input field is the exact phrase that will be Googled when the step runs, i.e. what do you want to search in Google?

{% hint style="info" %}
To search from a specific site, you can type **site:[www.example.com](http://www.example.com)** followed by your search phrase
{% endhint %}

### Search Parameters

Configure your search parameters using the dropdown menus:

* **Region**: Select the geographic region for your search results
* **Number of Results**: Choose how many results to return
* **Similar/Omitted Results**: Enable or disable filtering

{% hint style="info" %}
**Advanced Configuration:** For more complex use cases, you can still configure parameters based on the [SERP API documentation](https://serpapi.com/search-api) using JSON format.
{% endhint %}

To dynamically set variables as query or search parameters referencing an input (defined in the "Start" step) or output variable (generated by any step), you will need to use Liquid syntax:

{% @arcade/embed url="<https://app.arcade.software/share/ziYB9Ed9nh8CDuLHOHcX>" flowId="ziYB9Ed9nh8CDuLHOHcX" %}

### Output Types

The following Output Types are currently supported by the "Google Search" Step:

<figure><img src="/files/cjfxYAJYmfUl4c25vcbl" alt=""><figcaption></figcaption></figure>

**Links Only**: A list with links to the organic URL results.

```json
[
  "https://www.zdnet.com/article/six-skills-you-need-to-become-an-ai-prompt-engineer/",
  "https://en.wikipedia.org/wiki/Prompt_engineering",
  "https://www.mckinsey.com/featured-insights/mckinsey-explainers/what-is-prompt-engineering",
  "https://www.techtarget.com/searchenterpriseai/definition/AI-prompt-engineer",
  "https://www.datacamp.com/blog/what-is-prompt-engineering-the-future-of-ai-communication",
  "https://www.promptingguide.ai/",
  "https://aws.amazon.com/what-is/prompt-engineering/",
  "https://hbr.org/2023/06/ai-prompt-engineering-isnt-the-future",
  "https://www.iit.edu/blog/unlock-career-opportunities-ai-how-become-ai-prompt-engineer",
  "https://www.coursera.org/articles/how-to-become-a-prompt-engineer"
]
```

**Title, Snippet, Links (Markdown)**: Title, Snippet and Links for each organic result in Markdown format.

```markdown
**Six skills you need to become an AI prompt engineer**
Six skills you need to become an AI prompt engineer · 1. Understand AI, ML, and NLP · 2. Define problem statements clearly and specify detailed ...
https://www.zdnet.com/article/six-skills-you-need-to-become-an-ai-prompt-engineer/


**Prompt engineering**
Prompt engineering is the process of structuring text that can be interpreted and understood by a generative AI model. ... A prompt is natural language text ...
https://en.wikipedia.org/wiki/Prompt_engineering


**What is prompt engineering?**
Prompt engineering is the practice of designing inputs for generative AI tools that will produce optimal outputs.
https://www.mckinsey.com/featured-insights/mckinsey-explainers/what-is-prompt-engineering

...

```

**Organic Results (JSON)**: Organic results in JSON format.

```
[
  {
    "position": 1,
    "title": "Six skills you need to become an AI prompt engineer",
    "link": "https://www.zdnet.com/article/six-skills-you-need-to-become-an-ai-prompt-engineer/",
    "displayed_link": "https://www.zdnet.com › ... › Artificial Intelligence",
    "favicon": "https://serpapi.com/searches/65579a96e815af000b7dab68/images/a5422e713e6bc3f59a76b766eb80117740cc3058315f42d3df7f4337510ce3b6.png",
    "date": "Oct 3, 2023",
    "snippet": "Six skills you need to become an AI prompt engineer · 1. Understand AI, ML, and NLP · 2. Define problem statements clearly and specify detailed ...",
    "snippet_highlighted_words": [
      "prompt engineer"
    ],
    "about_page_link": "https://www.google.com/search?q=About+https://www.zdnet.com/article/six-skills-you-need-to-become-an-ai-prompt-engineer/&tbm=ilp",
    "about_page_serpapi_link": "https://serpapi.com/search.json?engine=google_about_this_result&google_domain=google.com&q=About+https%3A%2F%2Fwww.zdnet.com%2Farticle%2Fsix-skills-you-need-to-become-an-ai-prompt-engineer%2F",
    "cached_page_link": "https://webcache.googleusercontent.com/search?q=cache:QnozTEs7HoMJ:https://www.zdnet.com/article/six-skills-you-need-to-become-an-ai-prompt-engineer/&hl=en&gl=us",
    "source": "ZDNet"
  },
  ...
]
```

**Raw**: Complete results from Serp API in JSON format.

```
{
  "search_metadata": {
    "id": "65ad949daf5af14fb1f744b3",
    "status": "Success",
    "json_endpoint": "https://serpapi.com/searches/c058cc17ce2a376c/65ad949daf5af14fb1f744b3.json",
    "created_at": "2024-01-21 22:03:09 UTC",
    "processed_at": "2024-01-21 22:03:09 UTC",
    "google_url": "https://www.google.com/search?q=How+does+an+LLM+work%3F%0A%0A&oq=How+does+an+LLM+work%3F%0A%0A&num=1&sourceid=chrome&ie=UTF-8",
    "raw_html_file": "https://serpapi.com/searches/c058cc17ce2a376c/65ad949daf5af14fb1f744b3.html",
    "total_time_taken": 2.5
  },
  "search_parameters": {
    "engine": "google",
    "q": "How does an LLM work?\n\n",
    "google_domain": "google.com",
    "num": "1",
    "device": "desktop"
  },
  ...
```


# Perplexity Deep Research

Conduct comprehensive AI-powered research with citations

The "Perplexity Deep Research" step allows you to perform in-depth research on any topic using Perplexity's advanced AI research capabilities. This step conducts thorough analysis across multiple sources and provides detailed, cited responses that are helpful for content creation, market research, and competitive analysis.

<figure><img src="/files/Jumj6KLcUdgzdYZQCvxS" alt=""><figcaption></figcaption></figure>

### Configuring the Perplexity Deep Research Step

Configuring the step requires setting the core message and optional advanced parameters:

#### Message

The "Message" input field contains your research query or question - what you want to conduct deep research on. This should be a clear, specific question or topic you want thoroughly researched.

Examples:

* "Compare the top 5 content management systems for enterprise businesses"
* "Analyze the competitive landscape for project management software"

To dynamically set the research query referencing an input or output variable, use Liquid syntax: `{{ query }}` or `{{ step_1.output }}`

### Advanced Settings

#### Max Output Length (tokens)

Control the length of the research output. Higher token limits allow for more comprehensive research and detailed analysis.

#### Search Recency

Specify the time period for information sources. The model will only search for information from the selected time period, ensuring you get the most current data available.

Options include:

* Last year
* Last month
* Last week
* Last hour

#### Domains to Include

Limit research to specific domains by entering comma-separated domain names (e.g. `techcrunch.com, wired.com, verge.com`). This helps focus research on authoritative sources in your industry. This can include a maximum of 3 domains.

#### Domains to Exclude

Exclude specific domains from research results by entering comma-separated domain names. Useful for filtering out competitors or unreliable sources. This can include a maximum of 3 domains.

#### Enable Streaming

View research outputs as they are generated in real-time, rather than waiting for the entire execution to finish. Helpful for monitoring progress on complex research queries.

#### Get Images

Return relevant images found during research in the response. These images can be used to enhance content or provide visual context for your research findings.

#### Get Related Questions

Return a list of related questions that emerged during the research process. These can help identify additional content opportunities or research angles.


# Web Page Scrape

Scrape text, markdown or HTML from a website

The "Web Page Scrape" Step allows you to automate a text/markdown/HTML scrape from a specific URL. You can combine this with an Iteration Step to scrape through multiple websites, and parse the output separately.

## Configuring the "Web Page Scrape" Step

Configuring the step requires setting the parameters shown below:

<figure><img src="/files/I32NOZZ9qvOd7YmCuEyQ" alt=""><figcaption><p>Configure your Web Page Scrape parameters</p></figcaption></figure>

### URL

Add the specific URL you want the step to scrape.

### Maximum Length

Optionally, you may limit the number of characters returned by the step.

This parameter can be helpful to limit the amount of text passed to a subsequent LLM step, which has a limited context window.

{% hint style="warning" %}
**1 token is approximately 4 characters in English.** To estimate the number of characters, you should pass to an LLM step, multiply the # of tokens you want to pass by 4.
{% endhint %}

### How to continue if the Web Scrape step fails

By default, the code step will terminate the workflow if it fails. However, to continue the workflow if the step fails, simply click `Continue` at the bottom of the step.

<figure><img src="/files/YzP2h4hAeaw47rcP2HhR" alt=""><figcaption><p>Click continue to continue the workflow</p></figcaption></figure>

The step will return the following keys:

* `output` : this will be `null`
* `error` :
  * `message`: the message returned from the step
  * `code` : the error code representing the error

<figure><img src="/files/o0zPkVk5AuQbsnsftFzR" alt="" width="563"><figcaption></figcaption></figure>

### Enable Javascript rendering?

By default, the Web Page Scrape Step will not render websites that use Javascript.

Check this box to enable scraping from websites that use Javascript to help render dynamic content (examples include Facebook, Airbnb, and more).

### Timeout

The maximum time to wait for your webscraped results to return in milliseconds.

### Type of Proxy:

Use the **residential proxy** for sites that require more reliability and higher success rates. On the other hand, use the **datacenter proxy** where reliability and success rates are not a concern.

**Datacenter:**

* Private IP addresses that are housed in data centers
* Offer higher speed but they are less reliable in terms of anonymity
* More likely to be detected and blocked by websites and internet services.

#### Residential

* A real IP address attached to a physical location
* Webscraping will appear as if it's coming from a residential home in a certain location
* Considered more legitimate and less likely to be blocked by websites

{% hint style="info" %}
Note: Using a residential proxy is more expensive than using the datacenter, so it's good to measure this against your use-case when deciding which proxy to use.
{% endhint %}

#### Headers

Use this field to pass custom headers for the web scrape request. Ensure the headers are formatted as valid JSON. For example:

```javascript
{
    "authorization": "Bearer YOUR_API_KEY",
    "Content-Type": "{{ a_variable }}"
}
```

### Output Type

* **Text:** No formatting included
* **HTML:** Extract headers and formatting from a website in HTML
* **Markdown:** Extract the headers from a website in markdown


# Code

Apply programmatic and logical functions into your Workflows

Code Steps enable users to add more traditional automation into Workflows. If you're looking for a way to recreate common behavior across coding languages, then the following steps likely hold your answer:

1. [**Run Code**](/actions/workflow-concepts/workflow-steps/logic-steps/code) -- apply custom Python or Javascript code to transform data or add complex logic
2. [**Call API** ](/actions/workflow-concepts/workflow-steps/logic-steps/api)-- make HTTP requests to external APIs and services
3. [**Format JSON**](/actions/workflow-concepts/workflow-steps/logic-steps/json) -- structure the output of your Workflow as valid JSON for easier consumption
4. [**Run SQL Query**](/actions/workflow-concepts/workflow-steps/logic-steps/sql-query) -- execute queries against your connected databases
5. [**Write Liquid Text**](/actions/workflow-concepts/workflow-steps/logic-steps/text) -- create text templates with dynamic variable substitution

Code Steps provide the flexibility and power needed to handle complex data transformations, integrate with external services, and implement custom logic that goes beyond what's possible with pre-built steps. Whether you need to parse complex data structures, perform mathematical calculations, or connect to specialized APIs, Code Steps give you the tools to accomplish these tasks within your workflows.

{% hint style="info" %}
Note: Code Steps are only available for Workflow applications. They are not available for Agents at this time.
{% endhint %}


# Run Code

Add custom logic with Javascript or Python

## How does the Code Step work?

The Code Step in AirOps Studio currently supports **Javascript** and **Python**, which provides you with the flexibility needed to perform advanced requests.

{% hint style="warning" %}
The code in a Code Step is wrapped inside a function, and you must use a **return** statement to output results from the step.
{% endhint %}

<figure><img src="/files/wpUeXp4didTel7dnWgIO" alt=""><figcaption><p>Example Code Step</p></figcaption></figure>

## Javascript

### How to Reference an Input

Unlike Liquid, Javascript variables **exclude** `{{` or `}}` . For example:

* `{{linkedin_url}}` would be `linkedin_url`

### How to Reference an Output

Javascript syntax is similar to Liquid, but excludes brackets:

* `{{step_1.output}}` would be `step_1.output`
* `{{step_1.output.name}}` would be `step_1.output.name`

### Use a Return Statement

You must include a `return` statement in a Code Step to determine the output of the step

### Javascript Example

Let's walk through an example that references both a text input as well as an LLM output. We'll use a basic Workflow that requests a string input, and returns a match of words that rhyme with it.

Our Code Step will simply be responsible for combining the input prompt with the LLM output, so we have just a single result that includes the question and answer:

{% @arcade/embed url="<https://app.arcade.software/share/ucsCBgcBlpyFyrPMzrZi>" flowId="ucsCBgcBlpyFyrPMzrZi" %}

## Python

### How to Reference an Input

Similar to Javascript, Python only requires direct reference to the variable name. So the same example from above holds true:

* `{{linkedin_url}}` would be `linkedin_url`

### How to Reference an Output

Python syntax must include brackets around the variable name:

* `{{step_1.output}}` would be `step_1["output"]`
* `{{step_1.output.key}}` would be `step_1["output"]["key"]`

### Use a Return Statement

You must include a `return` statement in a Code Step to determine the output of the step.

### Supported Python Packages

As of 2/13/2024:

```
pandas==1.3.4
requests
beautifulsoup4
lxml
pyjwt
urllib3==1.26.6
scipy
numpy
pycryptodome
bing-image-urls
markdown
PyPDF2
```

### Adding Additional Python Packages

While we're always looking to add to our natively supported packages, our Code Step does offer a workaround for working with additional packages.

When writing your Code Step, append the following code to your block:

```python
import os
import sys
import subprocess

# pip install custom package to /tmp/ and add to path
subprocess.call('pip install flask -t /tmp/ --no-cache-dir'.split(), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
sys.path.insert(1, '/tmp/')
import flask

return 'import ok'
```

{% hint style="info" %}
Note: Any external libraries called with this method will get installed every time the Code Step runs, potentially adding noticeable seconds of execution time.
{% endhint %}

### Python Example

Let's walk through the same example from above, but in Python:

{% @arcade/embed url="<https://app.arcade.software/share/gM15e94F8pxxwY3ExGy3>" flowId="gM15e94F8pxxwY3ExGy3" %}

## AI Helpers

Both Python and Javascript support using our AI Helper to generate code. This can be useful if you're struggling to find the exact syntax in either language to achieve your goal.

Similar to the prompt for an LLM, we recommend being as clear and thorough in your description as possible.

{% @arcade/embed %}

Once our AI Helpers have generated the code, you can keep or reject the generated text. If you decide you want to add or remove the code later on, you can use the same "Generate with AI" button to modify your prompt and code.

## How to continue if the Code step fails

By default, the code step will terminate the workflow if it fails. However, to continue the workflow if the step fails, simply click `Continue` at the bottom of the step.

<figure><img src="/files/YzP2h4hAeaw47rcP2HhR" alt=""><figcaption><p>Click continue to continue the workflow</p></figcaption></figure>

The step will return the following keys:

* `output` : this will be `null`
* `error` :
  * `message`: the message returned from the step
  * `code` : the error code representing the error

<figure><img src="/files/o0zPkVk5AuQbsnsftFzR" alt="" width="563"><figcaption></figcaption></figure>

## How to retry if the Code step fails

To retry a step if it fails,

1. Select `Continue` instead of `Terminate Workflow` if the step fails
2. Add a conditional where the condition checks if the `error` from the step exists e.g. `step_1.error`
3. Add the step that you want to retry if there was an error

<figure><img src="/files/IMUoF6p5vnc1tKpClx2m" alt="" width="563"><figcaption><p>Check if an error occurred</p></figcaption></figure>

## Limits

There are two main limits to be aware of regarding our Code Step:

1. They have a maximum runtime of 15 minutes
2. The maximum payload size is 6MB


# Call API

Call external API's in your workflow

The "API" Utility Step allows your AirOps Workflows to communicate with external services via their APIs. This allows you to integrate and interact with data and functionalities that are outside of your Workflow.

## Configuration

There are two types of request method that we support, read the API docs for your integration to find out the best method to use :

* **GET Requests**:
  * This type of request is generally used to retrieve data from a service
* **POST Requests**:
  * A POST request is used to push data to a service
  * This is typically used when you want to create or update data on the server
  * For instance, you may want to create a new record in a database or update a user's profile information

### Reference Inputs or Outputs in the API Step

To dynamically set variables in your API and reference an input (defined in the "Start" step) or output variable (generated by any step), you will need to use Liquid syntax. Additionally, you will need to specify your Headers and Body values.

#### Headers

For passing in your header value, it is important that you format the information as JSON. We will always set our Content-Type as shown below, and you can include the API Key for any calls that require authorization:

```javascript
{ 
    "authorization": "Bearer YOUR_API_KEY",
    "Content-Type": "application/json"
}
```

#### Body

The body allows us to specify any additional parameters (i.e. variables or outputs) to be included in the API call. We use the same syntax as the header, where both our keys and values are wrapped in quotes. If we're passing in any inputs or step outputs, we use Liquid syntax while still wrapping with double-quotes, e.g.

```javascript
{
  "properties": {
    "amount": "",
    "dealname": "{{ step_2.output.deal_name }}",
    "pipeline": "",
    "closedate": "{{ step_2.output.deal_close_date }}",
    "dealstage": "",
    "hubspot_owner_id": ""
  }
}
```

#### Examples

Let's put this all together with a couple of examples. If you have a user input defined as location at the start of your Workflow, you can include {{ location }} in the URL or body of your API step to make a request to a weather API:

```
GET https://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&query={{ location }}
```

Similarly, you can use outputs from other steps as variables. If you have a step that retrieves a user's ID, you can use the output of that step as a variable in the API step:

```
POST https://api.example.com/user/{{ step_1.output }}/profile
```

This enables you to create dynamic API requests that adjust based on the inputs and outputs in your workflow. As an example, you can reference the API Step shown in our "Sales Call Lead Qualifier" template shown below:

<figure><img src="/files/CtROYGBrH3CvR8JgUicC" alt=""><figcaption><p>Our API Step calls the Fireflies API</p></figcaption></figure>

## How to continue if the API step fails

By default, the API step will terminate the workflow if it fails. However, to continue the workflow if the step fails, simply click `Continue` at the bottom of the step.

<figure><img src="/files/YzP2h4hAeaw47rcP2HhR" alt=""><figcaption><p>Click continue to continue the workflow</p></figcaption></figure>

The step will return the following keys:

* `output` : this will be `null`
* `error` :
  * `message`: the message returned from the step
  * `code` : the error code representing the error

<figure><img src="/files/o0zPkVk5AuQbsnsftFzR" alt="" width="563"><figcaption></figcaption></figure>

## How to retry if the API step fails

You can retry the API step up to 3 times by clicking on **Advanced Settings**

However, if the step still failed after 3 retries, you may:

1. Select `Continue` instead of `Terminate Workflow` if the step fails
2. Add a conditional where the condition checks if the `error` from the step exists e.g. `step_1.error`
3. Add the step that you want to retry if there was an error

<figure><img src="/files/IMUoF6p5vnc1tKpClx2m" alt="" width="563"><figcaption></figcaption></figure>

## Need more control?

For advanced API requests, use our Python step with custom code, using the [Code Step](https://docs.airops.com/docs/code-step), which can make external requests.


# Format JSON

Format output as JSON

## How does the JSON Step work?

The JSON Step allows you to structure the output of your workflow into a standardized JSON format. This is done by selecting the keys and values of the different steps you want to expose in the output.

## How to Configure a JSON Step

The JSON Step is fairly intuitive. Given that you're formatting the output of a previous step, it will typically flow directly into your End step.

You can name the "key" and "value" to whatever you choose, and you can choose to populate them with the input of prior steps:

{% @arcade/embed url="<https://app.arcade.software/share/BtyQUAfSJf5dzhIWUVIR>" flowId="BtyQUAfSJf5dzhIWUVIR" %}

Clicking the **"Add Variable +"** button will let you define additional fields within your JSON output.

## Example

Let's walk through a quick example of using a JSON Step to achieve our desired output in a JSON format.

Our workflow takes a simple string input (city name), and utilizes an LLM Step to generate a quick historic description of the city. We'll insert our JSON Step after this, formatting our output as:

```
{
  "city_name": "Los Angeles",
  "description": "The full description of the city."
}
```

{% @arcade/embed url="<https://app.arcade.software/share/2XKC3NgLFXFs5zJYKZNJ>" flowId="2XKC3NgLFXFs5zJYKZNJ" %}


# Run SQL Query

Query your database directly from a workflow

The SQL Query Step allows you to run queries directly against your connected databases. This can be useful for pulling data into your workflows, or even building out workflows focused on writing directly to your databases.

## Configuring a "SQL Query" Step

The SQL Query Step is fairly straightforward. The only prerequisite is that you have connected a SQL database via a read user. See our documentation page on [Connecting Datasources](/context/memory-stores/add-data/import-from-sql-database/data-sources) for more information.

Once you have successfully connected a data source, you can add a SQL Query Step into your Workflows as shown below:

{% @arcade/embed url="<https://app.arcade.software/share/10JanDKu9KE0Ahb7n7Fp>" flowId="10JanDKu9KE0Ahb7n7Fp" %}

One of the most powerful use-cases we've seen for our SQL Query Step is to power an Agent to assist with writing and editing your own queries. It was so popular, that we built our "Data Sidekick" Agent template around it.

As you start to dig into your use-cases more deeply, we would recommend giving it a quick peek behind the curtains:

<figure><img src="/files/N8uCvlBSOhuA3UCzI2b9" alt=""><figcaption><p>Using a SQL Query Step to power our "Data Sidekick" Agent</p></figcaption></figure>


# Write Liquid Text

Format your output into a string

## How does the Text Step work?

The Text Step allows users to concatenate the outputs of previous steps into a single string. It's most often used as the final step in your workflow to ensure your final output is structured exactly the way you would like.

{% hint style="info" %}
Text Steps are also a great option for extracting multiple values stored in lists or arrays that you may want to concatenate into a single string.
{% endhint %}

## How to Configure a Text Step?

The most basic implementation of a Text Step is straightforward. You simply need to reference the desired variables or step outputs using Liquid syntax, as shown below:

<figure><img src="/files/L3E0v5LdfVHwwFf3AySl" alt=""><figcaption><p>Call your previous steps together</p></figcaption></figure>

In this example, our Text Step is concatenating Step 10 (generating a title) with Step 9 (generating the article content). So, our end result is a properly formatted article with the title followed by the body.

## Concatenating the Output of an Iteration Step

One of the more popular use-cases for a Text Step is to extract values from an Iteration Step. The general formatting for this is:

```
{% for chunk in step_x.output %}
{{chunk}}
{% endfor %}
```

with "step\_x" representing your Iteration Step, and the "chunk" being the values we want to pull. Let's take a look at another example:

<figure><img src="/files/fIH6ce2YxD7uZH4BblOz" alt=""><figcaption><p>Concatenate values pulled from the Iteration Step</p></figcaption></figure>

This is pulled directly from our "Article Merge" template. Out Iteration Step (step\_12) checks to see whether it is writing an introduction for our article or if it is writing the body of the article. By calling our Text Step as:

```
{% for chunk in step_12.output %}
{{ chunk }}
{% endfor %}
```

We are effectively combining the results of each piece into a single string.


# Flow

Flow Steps provide essential control mechanisms that determine how your workflows operate and process data. These powerful tools enable conditional logic, iteration, human intervention, and error handling to create sophisticated workflow behaviors.

The Flow Steps include:

1. [**Condition**](/actions/workflow-concepts/workflow-steps/flow/conditional) -- create branching paths in your workflow based on logical expressions
2. [**Iteration**](/actions/workflow-concepts/workflow-steps/flow/iteration) -- loop through data sets to process items one by one
3. [**Human Review**](/actions/workflow-concepts/workflow-steps/flow/human-review) -- pause workflows for manual review and approval
4. [**Content Comparison**](/actions/workflow-concepts/workflow-steps/flow/content-comparison) -- identify and visualize differences between content versions
5. [**Error**](/actions/workflow-concepts/workflow-steps/flow/error-step) -- handle specific error scenarios with custom messaging

Flow Steps act as the decision-making framework for your workflows, allowing you to implement complex business logic, quality control checkpoints, and fallback mechanisms. By combining these steps, you can create workflows that respond intelligently to different scenarios, process large datasets efficiently, and maintain quality through human oversight.

Use Condition steps to route your workflow based on data values, Iteration steps to process lists of items, Human Review steps to ensure quality through manual checks, Content Comparison steps to highlight differences between content versions, and Error steps to gracefully handle exceptions with user-friendly messages.

{% hint style="info" %}
Note: Flow Steps are primarily designed for Workflow applications. Some steps may have limited functionality when used in Agents.
{% endhint %}


# Condition

Branch your workflow logic

## Condition Step

The Condition Step allows you to create branching logic in your workflows, executing different steps based on whether a specified condition evaluates to `True` or `False`.

### What is a Condition Step?

A Condition Step acts as a decision point in your workflow, directing the flow based on a JavaScript expression that you define. It consists of:

1. **The Condition**: A JavaScript expression that evaluates to either `True` or `False`
2. **True Path**: Steps that execute when the condition evaluates to `True` (left branch)
3. **False Path**: Steps that execute when the condition evaluates to `False` (right branch)

<figure><img src="/files/ZeKAjVTW81SYHRVW1CDA" alt=""><figcaption></figcaption></figure>

### How to Configure a Condition Step

1. Click the "+" button to add a new step in your workflow
2. Select "Flow" from the categories, then choose "Condition"
3. In the configuration panel, enter your JavaScript condition
4. Add steps to both the True and False paths as needed

### Condition Expression Syntax

Conditions are written as JavaScript expressions that evaluate to a boolean value. You can:

* Use comparison operators: `>, <, >=, <=, ===, !==`
* Apply logical operators: `&&` (AND), `||` (OR), `!` (NOT)
* Use conditional (ternary) operators: `condition ? trueValue : falseValue`
* Access nested properties: `step_2.output.results[0].score > 80`

### Common Use Cases

* **Content branching**: Generate different content types based on user input
* **Error handling**: Take alternative actions when a step fails
* **Quality control**: Route content through additional steps if it doesn't meet quality thresholds

### Example

```javascript
// If the keyword has high search volume, use a more detailed research approach
step_2.output.search_volume > 5000
```

This condition will route the workflow through the True path for high-volume keywords and the False path for lower-volume keywords, allowing you to optimize your research process for each scenario.

### Best Practices

* **Keep conditions simple**: Complex logic is harder to debug and maintain
* **Provide default paths**: Ensure both True and False paths are configured
* **Use descriptive names**: Rename your condition steps to describe their purpose (e.g., "Check Search Volume")
* **Test thoroughly**: Verify both paths work as expected with different inputs

Condition Steps are powerful tools for creating adaptable workflows that respond intelligently to different scenarios and data conditions.


# Iteration

Execute a step multiple times over a list of objects

## How does the Iteration Step work?

The Iteration Step executes the same step(s) over each entry within a list. The only prerequisite to using an Iteration Step is ensuring that your input values have already been formatted into a list object.

<figure><img src="/files/uhE7c5iADL3B2Vc0Ecig" alt=""><figcaption></figcaption></figure>

## What is a list?

A list is a specific data type with elements separated by commas that begins with `[` and ends with `]` . For example:

**A list of numbers:**

```
[1,2,3,4,5]
```

**A list of strings:**

```
["sales", "marketing", "finance"]
```

**A list of JSON objects:**

```
[
  {
    "link": "https://openai.com/",
    "title": "OpenAI",
    "source": "OpenAI"
  },
  {
    "link": "https://www.youtube.com/@OpenAI",
    "title": "OpenAI",
    "source": "YouTube"
  },
  {
    "link": "https://en.wikipedia.org/wiki/OpenAI",
    "title": "OpenAI",
    "source": "Wikipedia"
  }
]
```

## How do I create a list?

Lists can be generated in multiple different ways, including through an LLM step, code step, Google Search or API step. It ultimately comes down to what works best for your use-case, and we've provide a few examples below to help.

### Creating a list via an LLM Step

Because our LLM Steps allow you to adjust the prompt until you've achieved the desired outcome, it's a simple matter of specifying the list format within your prompt.

Let's walk through an example workflow that takes in a country name as input, and returns the top 5 cities in that country. We'll adjust the existing workflow to return those top 5 cities in a list format:

### Creating a list via a Code Step

As our [Code Step](/actions/workflow-concepts/workflow-steps/logic-steps/code) allows you to utilize both Javascript and Python, you can hard-code your return statement to match the desired list format, e.g.

```javascript
return(["San Francisco", "New York City", "Miami"]);
```

### Generating a list via a Google Search Step

Our Google Search Step allows you to select the specific formatting of your resulting search:

<figure><img src="/files/HZXsL8zsX6SCSxrXlvCh" alt=""><figcaption></figcaption></figure>

The resulting output of the Google Search Step will be formatted like so:

```javascript
// Output of the Google Search Step with Links Only
[
  "https://www.mckinsey.com/featured-insights/mckinsey-explainers/what-is-prompt-engineering",
  "https://www.zdnet.com/article/six-skills-you-need-to-become-an-ai-prompt-engineer/",
  "https://www.techtarget.com/searchenterpriseai/definition/AI-prompt-engineer",
  "https://en.wikipedia.org/wiki/Prompt_engineering",
  "https://www.datacamp.com/blog/what-is-prompt-engineering-the-future-of-ai-communication",
  "https://www.iit.edu/blog/unlock-career-opportunities-ai-how-become-ai-prompt-engineer",
  "https://aws.amazon.com/what-is/prompt-engineering/",
  "https://hbr.org/2023/06/ai-prompt-engineering-isnt-the-future",
  "https://time.com/6272103/ai-prompt-engineer-job/",
  "https://www.promptingguide.ai/"
]
```

## What is the element and element index?

An element is the actual object/value (e.g. string, number, or object) in your list.

The element index is the position of the element within the list, starting with the first element at index 0.

<figure><img src="/files/iJgx2eKksZHfJjE7EbLh" alt=""><figcaption></figcaption></figure>

## How do I reference the element?

You can reference the element by clicking the pill `step_x.element` within your Iteration Step:

<figure><img src="/files/ZCAsHxUzF8PRaQjJ1wMx" alt=""><figcaption></figcaption></figure>

In the example above, the LLM step will run 3 times, and the `{{step_1.element}]` will be replaced with `sales` , `marketing` , and `finance` as such:

* `Give me 3 personas in the sales department`
* `Give me 3 personas in the marketing department`
* `Give me 3 personas in the finance department`

## Is the element index required?

The element index is optional, but it can be used to perform powerful logic.

For example, in the case of our SEO blog writer, we use the `element_index` to help us write our introductions. Because our goal is to have the writer *only write to the first section* of the blog, the element index is useful for only applying the step in that paragraph.

So, we add a [**Conditional** **Step**](/actions/workflow-concepts/workflow-steps/flow/conditional) with:

* `step_x.element_index == 0`

which allows us to use a separate LLM Step with the introduction for the first section of the blog only.

## What does the output look like?

The iteration step will also output a list.

The output of each iteration will be added to the list in the same order of the input.

## How do I turn the list into text?

You can turn the array back into text with a simple **Text** step that uses Liquid:

```liquid
// Replace step_x.output

{% for chunk in step_x.output %}
{{chunk}}
{% endfor %}
```


# Human Review

Require Human Review of outputs before continuing a workflow

<figure><img src="/files/oc5TWMONtUL7cF1MRytK" alt=""><figcaption></figcaption></figure>

With the Human Review step, the user can be prompted to review, validate, and edit a text value (*Single Item*) or select and edit multiple values (*Multiple Values*) before continuing a workflow.

For example, you could create a list of 5 blog titles for a user to select from, ask the user to review and select the titles to publish with a review step, and finally publish the selected content to your blog.

## Review a Single Item

### What is a Single Item?

The single item allows the user to edit the text from a single-line text box:

<figure><img src="/files/PlNIA0PxzPDKF7lNzwX8" alt=""><figcaption><p>Single Item Review</p></figcaption></figure>

### How to Configure a Single Item

1. **Label the item:** the label will automatically create the variable name associated with your label. In the example below, we label our item "Blog Title", which also created the variable `blog_title`
2. **Assign the value of the item:** use Liquid syntax to pass the value that you want the user to edit and review. In the example below, this is `{{step_2.output}}`
3. **(Optional) Notify a Slack channel:** choose a Slack channel which will notify users to review the output

<figure><img src="/files/BSoEVvkkwSy1owlbI1px" alt=""><figcaption><p>Single Item Configuration</p></figcaption></figure>

## Review Multiple Values

### What is are Multiple Values?

Multiple values allow the user to select and edit multiple values at once:

<figure><img src="/files/3C13T0qEQAJy14xMBRIK" alt=""><figcaption><p>Multiple Values Review</p></figcaption></figure>

### How to Configure Multiple Values

1. Set up a list of options:

   1. **Generate a list:** use an LLM step to generate a list of items, it must be an Array

      <figure><img src="/files/OZRi1Ve5UxuRAifzYijf" alt=""><figcaption><p>A list of 5 blog titles</p></figcaption></figure>
   2. **Label the item:** the label will automatically create the variable name associated with your label. In the example below, we label our item "Blog Titles", which also created the variable `blog_titles`
   3. **Assign the value of the item:** use Liquid syntax to pass the list you generated in Step 1. In the example below, this is `{{step_2.output}}`
   4. **(Optional) Notify a Slack channel:** choose a Slack channel which will notify users to review the output

   <figure><img src="/files/EKeg0GA4twnQcUlgYnif" alt=""><figcaption><p>Multiple Values Configuration</p></figcaption></figure>

## Referencing the Human Review Step

### How to Reference a Single Item

To reference a single item from the Human Review step, use the variable corresponding to the label you provided.

In this example, we named the item "Blog Title" which created the variable `{{step_3.output.blog_title}}` :

<figure><img src="/files/yA1YpejKS9VTdYUwCNRc" alt=""><figcaption><p>Referencing a Single Item</p></figcaption></figure>

### How to Reference Multiple Values

To reference multiple values from the Human Review step, use the variable corresponding to the label you provided.

However, unlike referencing a single item, the output of a multiple value review is a list:

<figure><img src="/files/4JwzPSmgv42L0qUYrej9" alt=""><figcaption><p>Referencing Multiple Values</p></figcaption></figure>

In other words, `{{step_3.output.blog_titles}}` from the example above gives the user a list of blog titles. If you want to reference only the first blog title, you would need to modify your syntax to `{{step_3.output.blog_titles[0]}}`.

## Review Session

When a workflow reaches the review step, it pauses the execution, leaves the workflow in a pending state for review, and creates a review session where the user can review the content.

### How to Review Output

* **For single items,** you can edit the content using *markdown* syntax.
* **For multiple values,** you can edit the values and select/unselect them.
* After editing you can either choose to accept the reviewed content, or cancel the execution.

### Review in the Test Panel

As you test your workflow, you can access the review session by clicking on "Review":

<figure><img src="/files/zFxC2FEg98jqkpUmJAST" alt=""><figcaption><p>Review in the test panel</p></figcaption></figure>

### Review in Real-Time when Running Once

When you Run Once, the review session will automatically appear, and your user can review the outputs in real-time:

<figure><img src="/files/37mXKdP6uLcegM7AcQ4U" alt=""><figcaption><p>Review when running once</p></figcaption></figure>

### Review Asynchronously in the History

To review executions asynchronously, you can review them in the **History** tab:

1. Click on **History** to view all executions
2. Filter the **Status** to **Review needed**
3. Click on **View** in the Actions column
4. Click on **Review** to review the output and continue the execution

<figure><img src="/files/nh1vSauZttuzphk2M3f6" alt=""><figcaption><p>Review from the history tab</p></figcaption></figure>


# Content Comparison

AirOps Content Comparison step: visually diff two HTML versions with accept/reject review, for editorial QA, content quality control, and on-page content refresh.

## Content Comparison Step

The "Content Comparison" Step allows you to visually compare two pieces of HTML content and highlight the differences between them. It is built for content quality control, editorial QA, and on-page content refresh workflows with last-mile human review.

<figure><img src="/files/V8lq5pIq5Uv3HI3li8mL" alt=""><figcaption></figcaption></figure>

### What is the Content Comparison Step?

The Content Comparison step enables you to compare an original version of HTML content with a modified version, clearly visualizing additions, deletions, and changes. This is particularly valuable when you need to:

* Review AI-suggested content changes
* Track edits made during a content review process
* Verify content updates before publishing
* Maintain quality control over content versions
* **Perform on-page content refresh workflows with last-mile human review**

### How to Configure the Content Comparison Step

#### Original Content (HTML Required)

Specify the original **HTML content** that will serve as the baseline for comparison. This field expects HTML-formatted content and can be:

* A direct HTML string
* The output from a previous step that generates HTML (using Liquid syntax like `{{ step_1.output }}`)
* HTML content retrieved from your Knowledge Base or external source

**Important:** This field requires HTML content, not plain text or markdown.

#### Updated Content (HTML Required)

Specify the modified or updated **HTML content** that will be compared against the original. Like the original content, this field expects HTML and can be:

* A direct HTML string
* The output from a previous step that generates HTML (using Liquid syntax like `{{ step_2.output }}`)
* HTML content retrieved from your Knowledge Base or external source

**Important:** This field requires HTML content, not plain text or markdown.

#### Update Instructions (Optional - Any Format)

This optional field allows you to provide context about why changes were made. Unlike the content fields above, this field accepts **any text format** (not HTML required). You can include:

* Reasons for the content changes
* Instructions that were used to generate the updated content
* Notes about specific modifications made
* AI prompts or guidelines that led to the changes

When provided, AirOps will summarize these change reasons in the final diff view, making it easier for reviewers to understand the context behind content updates.

<figure><img src="/files/oENnAxWNcgGpevNYxsn0" alt=""><figcaption></figcaption></figure>

### Grid View with Visual Diff (Final Step Feature)

**When Content Comparison is the FINAL step in your workflow**, the grid output provides an enhanced review experience:

1. **Eye Icon in HTML Column**: The resulting HTML column in the grid will display an eye icon (👁️) next to each row
2. **Interactive Diff View**: Clicking the eye icon opens a visual diff viewer that shows:
   * Original content with strikethrough formatting for removed text
   * New content highlighted for additions
   * A "Proposed Improvement" summary (based on your Update Instructions)
   * **Accept/Reject buttons** for last-mile human review

{% @arcade/embed url="<https://app.arcade.software/share/bQYAXaaHWv1DalGqq6o6>" flowId="bQYAXaaHWv1DalGqq6o6" %}

This feature is **particularly powerful for on-page content refresh use cases**, where you need to:

* Review AI-suggested improvements to existing content
* Maintain quality control before publishing updates
* Ensure brand consistency and accuracy
* Make final accept/reject decisions with full context

### Best Practices

1. **Always use HTML content** for the Original and Updated Content fields
2. **Place Content Comparison as the final step** in your workflow to leverage the grid's visual diff viewer
3. **Provide clear Update Instructions** to help reviewers understand why changes were made
4. **Use for content refresh workflows** where human review of changes is critical before publishing

This step transforms content comparison from a technical process into an intuitive, visual review experience that empowers teams to confidently update and improve their content at scale.


# Error

Throw custom error messages that terminate the workflow

## What is the Error Step?

The Error Step allows you to terminate the workflow and display a custom error message and error code to users.

The error is composed of two parts:

1. **Error Code:** A custom identifier for the error, which can be used for tracking and debugging in the workflow API
2. **Error Message:** A custom message displayed in the AirOps UI, describing the error with instructions on how to resolve it.

### Example use case

Let's consider a scenario where we want to ensure that user input does not contain any sensitive content. We can configure the Error Step to throw the following error:

1. **Error Code:** `SENSITIVE_CONTENT_ERROR`
2. **Error Message:** `Your input contains sensitive information. Please remove any confidential data before proceeding.`

#### Error Step configuration:

<div data-full-width="false"><figure><img src="/files/DPRlEhroyVndg3jsDSQy" alt="" width="563"><figcaption><p>Error Configuration</p></figcaption></figure></div>

**Error Step displayed to user:**

<figure><img src="/files/2LKdr5LzOduSlYf4jPU4" alt="" width="473"><figcaption><p>Error Message</p></figcaption></figure>


# Data

Search and Write to your Knowledge Bases

Data Steps provide powerful capabilities to interact with AirOps' storage and retrieval systems. These tools allow you to leverage your organization's knowledge, seamlessly move information between different workflows, and manage your content at scale.

The Data Steps include:

1. [**Read from Grid**](/actions/workflow-concepts/workflow-steps/memory-steps/read-from-grid) -- import data from AirOps Grid to use within your workflow
2. [**Write to Grid**](/actions/workflow-concepts/workflow-steps/memory-steps/write-to-grid) -- export workflow results to AirOps Grid for storage or further processing
3. [**Search Knowledge Base**](/actions/workflow-concepts/workflow-steps/memory-steps/memory-search) -- semantically search your organization's knowledge bases
4. [**Write to Knowledge Base**](/actions/workflow-concepts/workflow-steps/memory-steps/memory-write) -- add new content to your knowledge bases for future retrieval
5. [**Get Knowledge Base File**](/actions/workflow-concepts/workflow-steps/memory-steps/knowledge-base-read) -- retrieve specific files stored in your knowledge bases

Data Steps form the connective tissue between your workflows and your organization's knowledge repositories. They enable workflows to access relevant information, learn from past executions, and contribute new insights back to your knowledge ecosystem.

These steps are particularly valuable for creating workflows that maintain context over time, building self-improving systems, and ensuring consistent access to the most current information across your organization. By combining Data Steps with other AirOps capabilities, you can create workflows that not only process information but also continuously enhance your organization's collective intelligence.

{% hint style="info" %}
Note: Data Steps are available in both Workflows and Agents
{% endhint %}


# Read from Grid

The "Read from Grid" Step allows you to get data from an existing AirOps Grid directly into your workflow.

### How to Configure the Read from Grid Step

#### Select a Grid

Choose the specific Grid you want to import data from. The dropdown will show all available Grids in your workspace.

#### Filtering Options

You can optionally filter the rows you want to import from the selected Grid:

* **All Rows**: Import all rows from the selected Grid
* **Selected Rows**: Import only specific rows based on your criteria

#### Column Selection

Choose which columns from the Grid you want to import:

* **All Columns**: Import all columns from the selected Grid
* **Selected Columns**: Specify only certain columns to import

### Output Format

The Read from Grid step outputs data in a structured format that can be easily used in subsequent steps of your workflow. The output will be an array of objects, with each object representing a row from the Grid.

Each row includes a special `__id` field that contains the unique identifier for that row. This `__id` is essential if you need to update specific rows later using the "Add Rows in Grid" step.

Example output:

```json
[
  {
    "__id": "123",
    "column1": "value1",
    "column2": "value2",
    "column3": "value3"
  },
  {
    "__id": "456",
    "column1": "value4",
    "column2": "value5",
    "column3": "value6"
  }
]
```

> **Note**: The `__id` field is automatically included in the output and represents the internal row identifier. You'll need this value when updating existing rows in your Grid.


# Add Rows in Grid

Add or update rows in a Grid from your workflow

The Add Row(s) in Grid step lets you create new rows or update existing rows in any Grid from within your workflow. Use this step when you need to write data to a different Grid or add new rows beyond the current row where your workflow is running.

{% hint style="info" %}
If you want to map workflow outputs to columns in the same row where your workflow is running, you don't need this step. Use a JSON step at the end of your workflow and map the outputs as columns in the Grid interface.
{% endhint %}

## How to Configure

### 1. Select Grid and Sheet

Choose the target Grid and Sheet where you want to write data. Both fields support Static or Dynamic selection:

* **Static**: Select from a dropdown of available Grids/Sheets
* **Dynamic**: Reference a variable containing the Grid or Sheet ID

### 2. Choose an Action Type

Select one of four action types based on your needs:

| Action Type              | Description                                             |
| ------------------------ | ------------------------------------------------------- |
| **Add Single Row**       | Create one new row from a single JSON object            |
| **Add Multiple Rows**    | Create multiple new rows from an array of objects       |
| **Update Single Row**    | Update one existing row using its `__id`                |
| **Update Multiple Rows** | Update multiple existing rows using their `__id` values |

### 3. Provide the Data Variable

Select a variable containing your row data:

**For single row actions**, provide an object:

```json
{
  "title": "Ultimate Guide to Link Building",
  "backlinks": "150"
}
```

**For multiple row actions**, provide an array of objects:

```json
[
  {
    "title": "Ultimate Guide to Link Building",
    "backlinks": "150"
  },
  {
    "title": "SEO Best Practices",
    "backlinks": "89"
  }
]
```

### 4. Map Object Keys to Grid Columns

Use the column mapping interface to connect your JSON keys to existing Grid columns. Click **Add Column Mapping** and specify:

* **Key**: The key name from your JSON object
* **Column**: The target column in your Grid

### 5. Set Failure Behavior

Choose what happens if the step fails:

* **Terminate Workflow**: Stop the workflow execution
* **Continue**: Proceed to the next step despite the error

## Updating Existing Rows

When using **Update Single Row** or **Update Multiple Rows**, your data must include the `__id` field to identify which rows to update. This field is automatically included when you read rows using the Read from Grid step.

### Example: Read, Modify, and Update

**Step 1**: Use Read from Grid to get existing rows with their `__id` values:

```json
[
  {
    "__id": "123",
    "title": "Blog Post Draft",
    "status": "Draft"
  },
  {
    "__id": "456",
    "title": "SEO Guide",
    "status": "In Review"
  }
]
```

**Step 2**: Transform the data in a Code step while preserving the `__id`:

```javascript
const rows = steps.read_grid.output;
return rows.map(row => ({
  __id: row.__id,
  status: "Published",
  published_date: new Date().toISOString()
}));
```

**Step 3**: Use Add Row(s) in Grid with **Update Multiple Rows** to write the changes back.

### Update Behavior

* Each object must include an `__id` that matches an existing row
* Only the columns you include will be updated; other columns remain unchanged
* Rows with non-matching `__id` values will be skipped
* You don't need to map `__id` in the column mapping section

## When to Use This Step

**Use Add Row(s) in Grid when:**

* Creating new rows in a separate Grid
* Adding multiple rows generated from a single workflow run
* Updating existing rows in any Grid

**Use a JSON step instead when:**

* Mapping outputs to columns in the current Grid row
* Organizing multiple outputs into a structured format for the same row


# Search Knowledge Base

Semantically search a Knowledge Base

## What is a Knowledge Base Search Step?

The Knowledge Base Search step allows you to semantically search your data in order to power customized content or recommendations to users.

For more information on setting up a Knowledge Base, see our documentation page [here](/context/memory-stores).

## How to Configure a Knowledge Base Search Step

### Select a Knowledge Base

Select the name of your Knowledge Base from the dropdown.

{% hint style="info" %}
**Dynamic Knowledge Base Selection:** You can use Liquid variables to dynamically select which Knowledge Base to search at runtime. This is useful when you have multiple Knowledge Bases and want to choose between them based on workflow inputs or previous step outputs. For example: `{{input.knowledge_base_name}}`
{% endhint %}

### Max Results

Choose the number of Knowledge Base results to return.

{% hint style="info" %}
Your content is chunked into 1000 tokens, so each result will be \~1000 tokens.
{% endhint %}

If you're finding that your LLM isn't returning the exact results you're looking for, then we recommend increasing the number of results and asking it to synthesize them.

### Filter the Knowledge Base (Optional)

Knowledge Bases have two different filter modes. Use filters to narrow your search based on metadata, including custom metadata tags you've added to your Knowledge Base files.

#### Visual Editor

The **Visual Editor** lets you filter data based on any metadata field, including:

* **Custom metadata** you've added (e.g., country, product, audience, content type)
* **Standard metadata** inherited from the source
* **CSV/Sheet columns** when searching structured data

For example, if you have case studies tagged with a `country` custom metadata field, you can filter to search only within case studies for a specific region:

<figure><img src="/files/LGabVGSoaBeJbgMrNgxA" alt=""><figcaption><p>Filter on a value via the Visual Editor</p></figcaption></figure>

{% hint style="success" %}
**Dynamic Filtering with Inputs**

Make your filters dynamic by using workflow inputs. For example, create an input called `region` and set your filter to: country equals `{{input.region}}`. Now when you run the workflow with different region values, you'll search only the relevant Knowledge Base files.
{% endhint %}

#### Code Editor

For more complex use cases, you can use the **Code Editor** which uses MongoDB's query and projection operators. Here are some common operators:

* **$eq** - Equal to (for numbers, strings, booleans)
* **$ne** - Not equal to (for numbers, strings, booleans)
* **$gt** - Greater than (for numbers)
* **$gte** - Greater than or equal to (for numbers)
* **$lt** - Less than (for numbers)
* **$lte** - Less than or equal to (for numbers)
* **$in** - In array (for strings or numbers)
* **$nin** - Not in array (for strings or numbers)

Let's walk through a quick example of how you can filter on Metadata in your Workflow using our "Q\&A" Template. In this specific example, we have already populated our Knowledge Base to include multiple countries' Constitutions, as well as Metadata focused around the "country" field to filter on.

{% @arcade/embed url="<https://app.arcade.software/share/wdZVVd8LeM0QNGiSf9v9>" flowId="wdZVVd8LeM0QNGiSf9v9" %}

In order for filtering to be effective, we recommend reading through our ["Knowledge Bases Metadata" document](/context/memory-stores/memory-stores-metadata) to ensure you're providing optimal metadata fields to filter on.

### Query

The phrase used to search your knowledge base for semantically similar text.

As best practice, we recommend that you utilize a liquid variable for your query. Because your workflows are meant to adapt to the inputs you provide, it typically isn't best to hard-code your query to a specific variable or question.

Because the Knowledge Base will return the most *semantically* similar results, there will be times where providing a long string of text will be more likely to return your desired results than a targeted, accurate phrase. We encourage you to test your query prompt to ensure it best fits your needs.

## Liquid Variables in Knowledge Base Steps

Liquid variables work across ALL Knowledge Base steps, including:

* **Search Knowledge Base:** Use Liquid for queries, filters, and Knowledge Base selection
* **Write to Knowledge Base:** Use Liquid for content and metadata values
* **Get Knowledge Base File:** Use Liquid for file identifiers
* **Read from Knowledge Base:** Use Liquid for record selection

This enables fully dynamic workflows where Knowledge Base operations adapt based on inputs or previous step outputs.

## Knowledge Base Search Step Output

The Knowledge Base Search step will output a list of embeddings from the knowledge base.

* **ID:** A unique ID based on the metadata Chunk ID, Record ID, and Vector Store Document ID.
* **Score:** A [measure of semantic similarity](https://en.wikipedia.org/wiki/Cosine_similarity).
* **Content:** The text (or columns) of your document that are searchable.
* **Document Name:** Name of the document you provided.
* **Document File URL:** The URL of the original document file you uploaded (if there's one).
* **Metadata:** Any columns you provided as metadata.

```
[
  {
    "id": "vsdi:87:rid:1:cid:0",
    "score": 0.78703,
    "content": "Blog Title: How to Become a Prompt Engineer\\nBlog Content: In this blog, we're going to show you how to take your prompting...",
    "document_name": "AirOps Knowledge Base",
    "document_file_url": "https://app.airops.com/your_document_file.pdf",
    "metadata": {
      "__chunk_id": 0,
      "__record_id": "1",
      "__vector_store_document_id": 87,
      "title": "How to Become a Prompt Engineer",
      "description": "Learn how to elevate your prompting to the next level.",
    }
  },
  {
    ...
  }
 ]
```

### Formatting Your Output for LLM Steps

The output of the Knowledge Base Search Step is a JSON blob as shown above. However, because you will often pass this output into an LLM, it is much more effective if you format the results in natural language.

#### Formatting with Code Step

One of the best ways to handle this is by using our Code Step in conjunction with Liquid syntax. Our "Q\&A" Template shows a great example of how you can achieve this:

<figure><img src="/files/cUkIoChjYnXJQR8M5Lpl" alt=""><figcaption></figcaption></figure>

Our Code Step utilizes Javascript to format the JSON Blob into a more natural format for our LLM Step to interpret:

```javascript
return step_1.output.map(item => `Document Name: ${item.document_name}\nContent: ${item.content}\nConfidence Score: ${item.score}`).join('\n\n');
```

#### Formatting with Liquid

To pass context and formatted data to the LLM step, you can also use Liquid to format your Knowledge Base Search Step results.

We modify our earlier example output above by iterating over each chunk and returning the `metadata.title` and `metadata.description`:

```liquid
// Replace step_x.output

{% for chunk in step_x.output %} 
    Title: {{chunk.metadata.title}}
    Description: {{chunk.metadata.description}}
{% endfor %}
```


# Write to Knowledge Base

Add a document to a Knowledge Base

## What is a Knowledge Base Write Step?

The Knowledge Base Write step allows you add content to an existing Knowledge Base. You can add both searchable content which will be converted into embeddings and metadata content which can be retrieved and filtered on.

Learn how to set up an AirOps Knowledge Base [here](/context/memory-stores).

## How to Configure the Knowledge Base Write Step

### Select a Knowledge Base

Select the name of your Knowledge Base from the dropdown.

### Text

The file, text, or data you want to make searchable.

### Metadata

Metadata that you want to assign to the embeddings in a JSON format such as:

```
{
    "title": "...",
    "description": "...",
    "tag": "..."
}
```

{% hint style="info" %}
Metadata allows you to[https://github.com/airopshq/airops-docs/blob/main/building-workflows/workflow-steps/memory-steps/broken-reference/README.md](https://github.com/airopshq/airops-docs/blob/main/building-workflows/workflow-steps/memory-steps/broken-reference/README.md "mention")in the Knowledge Base Search Step
{% endhint %}

## Knowledge Base Write for Maintaining State

One challenge in managing workflows with LLMs is ensuring continuity by keeping track of past decisions. For example, in creating a workflow that leverages a LLM to scour a website for "recent news" to suggest content ideas, it's crucial to have a mechanism in place for logging previous suggestions. This helps prevent the recurrence of ideas, maintaining the novelty and relevance of the content generated.

[Knowledge Bases](/context/memory-stores) can we help with this. By implementing the following framework you can solve this issue :

Before starting, create a new, empty Knowledge Base. Then, in your workflow, add the following :

1. **Knowledge Base Search** **Step -** Search Knowledge Bases for today's date. It will retrieve the most recent entries added to that Knowledge Base.
2. **LLM Step -** Provide \~5-10 outputs from the **Knowledge Base Search Step** to your model with a prompt like "Here are outputs you have provided previously, please do not repeat any of these ideas:"
3. **Knowledge Base Write Step** - Write to the Knowledge Base with today's date (see [Liquid docs](https://shopify.github.io/liquid/filters/date/) for more info) in the search column and add the output in a metadata column. This will mean that only the date will be used when the Knowledge Base is searched.

Any question, please contact us.


# Get Knowledge Base File

Read data from your Knowledge Bases by using filters.

## What is a Knowledge Base Read Step?

The Knowledge Base Read step allows you to query your Knowledge Bases by using filters in order to get any relevant data for use in your workflows. This is especially helpful when doing [Retrieval Augmented Generation](https://en.wikipedia.org/wiki/Retrieval-augmented_generation) (RAG).

The main difference between this step and the [Knowledge Base Search](/actions/workflow-concepts/workflow-steps/memory-steps/memory-search) step is that while in the search step, you can do queries and get text chunks, the read step allows you to apply filters and get full documents.

For more information on setting up a Knowledge Base, see our documentation page [here](/context/memory-stores).

## How to Configure a Knowledge Base Read Step <a href="#how-to-configure-a-memory-search-step" id="how-to-configure-a-memory-search-step"></a>

### Select a Knowledge Base

Select the Knowledge Base that you want to use from the dropdown.

<figure><img src="/files/mlE4lrBf24hVJJkDLHl8" alt=""><figcaption></figcaption></figure>

### Select specific files (optional)

You can optionally select multiple documents that you want to read from a list:

<figure><img src="/files/Xswn6pQ0FYf0xfQxac4S" alt=""><figcaption></figcaption></figure>

### Add Filters (Optional)

You can add filters to narrow down results based on metadata fields. This includes:

* **Standard metadata** inherited from the source (e.g., file name, source URL)
* **Custom metadata** you've added to tag files (e.g., country, product, audience)
* **CSV/Sheet columns** when the Knowledge Base contains structured data

**Example: Filtering by Custom Metadata**

If you have customer case studies tagged with a `country` custom metadata field, you can filter to retrieve only case studies for a specific region:

<figure><img src="/files/vg7ldGnE3ViDVbkwaMZb" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
**Dynamic Filtering**

Use workflow inputs to make filters dynamic. For example, set the filter to `country` equals `{{input.region}}` and the workflow will retrieve files matching whatever region is passed at runtime.
{% endhint %}

In order for the filtering to be effective, we recommend reading through [Knowledge Bases Metadata](/context/memory-stores/memory-stores-metadata) to learn how to add custom metadata tags to your Knowledge Base files.

## Knowledge Base Read Step Output

The Knowledge Base Read step will output a list of documents with their respective records. In our the previous filtered products example, the output will look like this:

```json
[
  {
    "document_name": "marketing_data.csv",
    "records": [
      {
        "__text": "WHITE HANGING HEART T-LIGHT HOLDER\n\n-----\n\nUnited Kingdom",
        "InvoiceNo": 536365,
        "StockCode": "85123A",
        "Description": "WHITE HANGING HEART T-LIGHT HOLDER",
        "Quantity": 6,
        "InvoiceDate": "12/1/2010 8:26",
        "UnitPrice": 2.55,
        "CustomerID": 17850,
        "Country": "United Kingdom"
      },
      ...
    ]
  },
  {
    "document_name": "marketing_data_2.csv",
    "records": [
      {
        "__text": "CREAM CUPID HEARTS COAT HANGER\n\n-----\n\nUnited Kingdom",
        "InvoiceNo": 536365,
        "StockCode": "84406B",
        "Description": "CREAM CUPID HEARTS COAT HANGER",
        "Quantity": 8,
        "InvoiceDate": "12/1/2010 8:26",
        "UnitPrice": 2.75,
        "CustomerID": 17850,
        "Country": "United Kingdom"
      },
      ...
    ]
  }
]
```

You can notice that:

* Only the documents that were selected from the dropdown are returned.
* Each document has a list of records attached to it. Since these documents are CSVs, each record represents a different row.
* Only the records that match the selected filters are returned (United Kingdom and UnitPrice < 3).
* There's a special "\_\_text" field that shows what's the searchable text selected during the CSV upload. Since in this case only the "Description" and "Country" columns were selected as searchable, those are the columns embedded in the "\_\_text" field.

The following is an example output of retrieving a pdf document:

```json
[
  {
    "document_name": "US_Congress-2023-SB546-Enrolled.pdf",
    "records": [
      {
        "__text": "S. 546  \n\nOne Hundred Eighteenth Congress of the United States of America\n\nAT T H E S E C O N D S E S S I O N\n\nBegun and held at the City of Washington on Wednesday, the third day of January, two thousand and twenty four\n\nAn Act\n\nTo amend the Omnibus Crime Control and Safe Streets Act of 1968 to authorize law enforcement agencies to use COPS grants for recruitment activities, and for other purposes...",
        "__languages": [
          "eng"
        ],
      }
    ]
  }
]
```

## Using The Step Output In Order To Do RAG

We can pass the output of the Knowledge Base Fetch step into an LLM step for doing Retrieval Augmented Generation.

Following with our products example, we can retrieve the full list of products and pass it into an LLM step like this:

<figure><img src="/files/yf62AiHWPzU40etdXkHD" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/uPfaJGMj5E8wog1Tpb3u" alt=""><figcaption></figcaption></figure>


# AirOps

With AirOps Workflow or Agent steps, you can run a Workflow or Agent as a step within another Workflow or Agent. This allows for modularity in building and allows you to reuse logic.

1. [**Workflow Step**](/actions/workflow-concepts/workflow-steps/utility-steps/app) -- reference an existing Workflow
2. [**Agent Step**](/actions/workflow-concepts/workflow-steps/utility-steps/agent) -- reference an existing Agent


# Workflow

## AirOps Workflow Step

The Workflow Step allows you to run a published workflow within another workflow, allowing you to reuse existing workflows rather than rebuilding the same functionality.

{% @arcade/embed url="<https://app.arcade.software/share/8MrnejvX1e1nap4jJDmC>" flowId="8MrnejvX1e1nap4jJDmC" %}

### Setup Instructions

1. Drag the Workflow Step from the side panel into your canvas
2. Select a published workflow from the dropdown list
3. Select the version of the workflow to use
4. Map the required inputs for the selected workflow
5. Configure error handling behavior (Terminate or Continue)

### Input Configuration

* The step will automatically display the input fields required by the selected workflow
* Map inputs using values from previous steps or static values
* Use the variable selector (purple icon) to reference outputs from previous steps

### Error Handling

* Choose "Terminate Workflow" to stop the parent workflow if this step fails
* Choose "Continue" to proceed with subsequent steps even if this workflow fails

### Notes

* The workflow you select must be published before it will appear in the dropdown
* Output from the workflow step can be referenced in subsequent steps using: `{{ step_X.output }}`


# Agent

## AirOps Agent Step

The Agent Step lets you run a published agent from your AirOps workspace within a workflow. This enables you to incorporate conversational AI capabilities into your structured workflows.

### How to Use

{% @arcade/embed url="<https://app.arcade.software/share/EKSAHKcMjIBh9c1pBFw6>" flowId="EKSAHKcMjIBh9c1pBFw6" %}

1. Drag the Agent Step from the side panel into your canvas
2. Select a published agent from the dropdown
3. Configure the required inputs
4. Set error handling (Terminate or Continue)


# Image & Video

<figure><img src="/files/bhUo5p9iuyzHoLf2ZOw7" alt=""><figcaption></figcaption></figure>

Image & Video Steps enable powerful visual content creation and manipulation capabilities within your AirOps workflows.

These steps allow you to generate, search, and modify visual assets that make your content more engaging. The Image & Video Steps include:

1. [**Generate Image with AI** ](/actions/workflow-concepts/workflow-steps/image-and-video/image-generation-step)-- create custom images using AI models like GPT Image, Nano Banana Pro, and Stable Diffusion
2. [**Search Stock Images**](/actions/workflow-concepts/workflow-steps/image-and-video/search-stock-images) -- find relevant stock photography for your content
3. [**Fetch Stock Image with ID**](/actions/workflow-concepts/workflow-steps/image-and-video/fetch-stock-image-with-id) -- retrieve specific stock images by their unique identifiers
4. [**Resize Image**](/actions/workflow-concepts/workflow-steps/image-and-video/resize-image) -- adjust image dimensions and quality to fit your requirements
5. [**Screenshot from URL**](/actions/workflow-concepts/workflow-steps/image-and-video/screenshot-from-url) -- capture screenshots of any webpage
6. [**Create OpenGraph Image**](/actions/workflow-concepts/workflow-steps/image-and-video/create-opengraph-image) -- generate custom social media preview images for better engagement
7. [**Create Video Avatar**](/actions/workflow-concepts/workflow-steps/image-and-video/create-video-avatar) -- produce AI-powered talking head videos for personalized content

These steps can be combined with other AirOps capabilities to automate visual content workflows.


# Generate Image with API

Generate and edit images and variations

<figure><img src="/files/DsYsyneCdlS448JFhh4Q" alt=""><figcaption></figcaption></figure>

The Generate Image with AI step allows you to create, edit, or generate variations of images directly within your AirOps workflows.

## Generate Image

### Popular AI Models for Image Generation

AirOps offers the following AI models for image generation:

| Model                                    | Provider     | Description                                                        |
| ---------------------------------------- | ------------ | ------------------------------------------------------------------ |
| GPT Image 2                              | OpenAI       | OpenAI's latest text-to-image model                                |
| GPT Image 1.5                            | OpenAI       | Previous-generation OpenAI text-to-image model                     |
| Nano Banana Pro (`gemini-3-pro-image`)   | Google       | Advanced text-to-image with 4K support and superior text rendering |
| Nano Banana 2 (`gemini-3.1-flash-image`) | Google       | Fast image generation with image-editing support                   |
| Stable Image Ultra                       | Stability AI | Highest quality photorealistic image generation                    |
| Stable Diffusion 3.5 Large               | Stability AI | Balanced speed and quality for digital content                     |

{% hint style="info" %}
**Nano Banana Pro** offers multiple resolutions up to 4K, improved text rendering, and better style consistency. Note that it is approximately 4x more expensive than other image generation models.
{% endhint %}

{% hint style="info" %}
The Gemini 3 preview model IDs have been retired. Workflows that used `gemini-3-pro-image-preview` or `gemini-3.1-flash-image-preview` automatically move to the corresponding GA model listed above.
{% endhint %}

{% hint style="warning" %}
**DALL·E models have been deprecated** and are no longer available in the model picker. Workflows that previously generated images, edited images, or generated variations with DALL·E should migrate to one of the models listed above.
{% endhint %}

## Edit Images

Choose an image-editing-capable model, such as Nano Banana 2, when you want to revise an existing image. Available controls can vary by model.

Provide the source image as either:

1. A ["File Media" Workflow Input](/actions/workflow-concepts/application-inputs/input-types#advanced-input-types) variable
2. A publicly accessible URL with a .png endpoint

For models that support mask-based editing, provide an Image Mask URL with the same dimensions as the source image. Transparent areas identify where the image can change.

## Generate Variations

The DALL·E 2-specific variations flow is no longer available. To produce alternate versions, generate again with a revised prompt or use an image-editing-capable model when you need to preserve elements of a source image.

If you choose to generate multiple images, the output is returned as JSON with an accessible URL for each generated image.


# Search Stock Images

The "Search Stock Images" step allows you to find stock images from AirOps' integration with stock image providers Getty Images and Unsplash.

{% hint style="info" %}
Note: This step is intended to be used with the Fetch Stock Image with ID step.

Search Stock Images step should be used first to return image options, and the selected image ID should be used to retrieve the final image using the Fetch Stock Image with ID step.
{% endhint %}

### How to Configure the Search Stock Images Step

Configuring the step requires setting the parameters shown below:

* **Provider**: Select Getty or Unsplash
* **Search Query**: Enter the keywords you want to use to search for relevant stock images. Be specific to get the most relevant results

### Output Format

The Search Stock Images step returns a JSON array of image results. Each result contains:

```json
[
  {
    "id": "1234567890",
    "preview_url": "https://example.com/images/id/1234567890/photo/image-description.jpg",
    "caption": "Description of the first image."
  },
  {
    "id": "0987654321",
    "preview_url": "https://example.com/images/id/0987654321/photo/another-image.jpg",
    "caption": "Description of the second image."
  },
  // Additional results appear here
]
```

### How to Use the Results

You can use the preview\_url to decide which image(s) you'd like to use in your content. Then, use the corresponding image IDs to retreive the image using the Fetch Stock Images with ID step.


# Fetch Stock Image with ID

The "Fetch Stock Image with ID" step allows you to retrieve a specific stock image using its unique identifier from either Getty Images or Unsplash.

{% hint style="info" %}
Note: This step is intended to be used with the Search Stock Images step.

Search Stock Images step should be used first to return image options, and the selected image ID should be used to retrieve the final image using the Fetch Stock Image with ID step.
{% endhint %}

### How to Configure the Fetch Stock Image with ID Step

Configuring the step requires setting the parameters shown below:

* **Provider**: Getty or Unsplash (be sure that your selection is the same as the Search Stock Images step provider)
* **Size**:
  * Thumbnail (100×100)
  * XSmall (480×480)
  * Small (740×740)
  * Medium (1080×1080) - optimized for web
  * Large (2000×2000)
  * Original
* **Image ID**: Enter the unique identifier of the stock image you want to retrieve. This ID is typically obtained from a previous "Search Stock Images" step or from the stock image provider directly.

### Output Format

The Fetch Stock Image with ID step returns an image URL.


# Resize Image

The "Resize Image" step allows you to adjust the dimensions and quality of images in your workflow. This is useful for optimizing images for various use cases such as web display, email inclusion, or social media posting.

{% hint style="info" %}
This step resizes images while maintaining the original aspect ratio. You can specify both width and height, or just one of them. The image will be resized to fit within the specified dimensions, ensuring that it does not exceed these dimensions.
{% endhint %}

### How to Configure the Resize Image Step

Configuring the step requires setting the parameters shown below:

* **Image URL**: Enter the URL of the image you want to resize.
* **Width**: Specify the desired width of the output image in pixels. You can set this to a specific value or leave blank to maintain the aspect ratio based on the height setting.
* **Height**: Specify the desired height of the output image in pixels. You can set this to a specific value or leave blank to maintain the aspect ratio based on the width setting.

### Output Format

The Resize Image step returns the image URL of the resized image.


# Screenshot from URL

The "Screenshot from URL" step allows you to capture a screenshot of a webpage directly within your workflow. This is useful for creating visual references, analyzing website designs, or including webpage captures in your content.

### How to Configure the Screenshot from URL Step

Configuring the step requires setting the parameters shown below:

* **URL**: Enter the complete URL of the webpage you want to capture. Make sure to include the protocol (http\:// or https\://).
* **Capture Mode**:
  * Full Page - Captures the full height (scrolls down the bottom of the page) and width of the page
  * Viewport - Captures the height of the original viewport (without scroll) and full width

### Output Format

The Screenshot from URL step returns an image URL.


# Create OpenGraph Image

The "Create OpenGraph Image" step allows you to generate customized social media preview images (OpenGraph images) for your content. These images appear when your content is shared on platforms like Facebook, Twitter, LinkedIn, and other social media sites.

### How to Configure the Create OpenGraph Image Step

Configuring the step requires setting the parameters shown below:

* **Shortened Article Title** - Enter a concise title (maximum 45 characters)
* **Background Color** - Specify the background color as a hex code (e.g., #3E0075)
* **Text Color** - Define the text color as a hex code (e.g., #FFFFFF for white or #000000 for black)
* **Logo URL** - Provide a URL to your logo image for branding

{% hint style="info" %}
Note: This step does not allow you to customize the location of the title nor logo.
{% endhint %}

### Output Format

The Create OpenGraph Image step returns an image URL.

Example OpenGraph image:

<figure><img src="/files/JvxJsRC0PfAhkw3LXALU" alt=""><figcaption></figcaption></figure>


# Create Video Avatar

The "Create Video Avatar" step allows you to generate AI-powered talking head videos featuring digital avatars that speak your provided text. This creates engaging, personalized video content without the need for filming real people.

### How to Configure the Create Video Avatar Step

* **Script** - Enter the text that you want the avatar to speak in the video. This can be a greeting, explanation, presentation, or any other content you'd like delivered by a digital spokesperson. (up to 30 minutes of content)
* **Emotion (Optional)** - Select the emotional style for delivery (Excited, Friendly, Serious, Soothing, or Broadcaster)
* **Avatar ID (Optional)** - Specify a custom avatar ID or use one from the provided selection at runtime
* **Voice ID (Optional)** - Define a specific voice ID for the avatar to use

### Output Format

The Create Video Avatar step returns a JSON object containing details about the generated video:

```json
{
  "video_download_url": "https://example.com/avatar-video.mp4",
  "video_id": "12345abcde",
  "thumbnail_url": "https://example.com/avatar-video-thumbnail.jpeg"
}
```


# Content Quality

Content Quality Steps provide critical validation tools to ensure your content meets high standards of originality and authenticity. These tools help you maintain trust with your audience and comply with content policies.

The Content Quality Steps include:

1. [**Detect AI Content**](/actions/workflow-concepts/workflow-steps/content-quality/detect-ai-content) -- identify text likely generated by AI models using Originality.ai's detection tools
2. [**Scan Content for Plagiarism**](/actions/workflow-concepts/workflow-steps/content-quality/scan-content-for-plagiarism) -- verify content originality and detect potential plagiarism using Originality.ai


# Detect AI Content

The "Detect AI Content" step allows you to analyze text to determine whether it was likely written by an AI or a human. This powerful tool uses Originality.ai's advanced AI detection technology to help you identify AI-generated content, ensuring content authenticity and compliance with content policies.

### How to Configure the Detect AI Content Step

* **Content**: Input the content you'd like to analyze

### Output Format

The Detect AI Content step returns a JSON object containing detailed analysis results:

```json
{
  "success": true,
  "disclaimer": "If you are trying to scan content that is under 50 words in length, you will run into AI accuracy issues.",
  "public_link": "https://app.originality.ai/share/[ID]",
  "title": "API V1 Scan",
  "score": {
    "original": 0,
    "ai": 1
  },
  "blocks": [
    {
      "text": "content text one ",
      "result": {
        "fake": 1,
        "real": 0,
        "status": "success"
      }
    },
    {
      "text": "content text two ",
      "result": {
        "fake": 0.9790024454394978,
        "real": 0.02099755456050223,
        "status": "success"
      }
    },
  
          // Additional results here        
  
  ],
  "credits_used": 3,
  "credits": 123,
  "subscription": 123,
  "content": "example content",
  "aiModelVersion": 1,
  "id": [ID]
}
```


# Scan Content for Plagiarism

The "Scan Content for Plagiarism" step allows you to check text for potential plagiarism by comparing it against billions of web pages, academic papers, and other published sources. This powerful tool uses Originality.ai's advanced plagiarism detection technology to help you ensure content originality and avoid copyright issues.

### How to Configure the Scan Content for Plagiarism Step

* **Content**: Input the content you'd like to analyze
* **Domain to Exclude (optional)**: Enter a URL to exclude from the analysis. This is typically your domain given that there is a high likelihood of content overlap between this content and your domain's existing content.

### Output Format

The Scan Content for Plagiarism step returns a JSON object containing detailed analysis results:

```json
{
  "success": true,
  "disclaimer": "If you are trying to scan content that is under 50 words in length, you will run into AI accuracy issues.",
  "public_link": "https://app.originality.ai/share/[ID]",
  "title": "API V1 Scan",
  "total_text_score": "93%",
  "results": [
    {
      "phrase": "phrase one",
      "results": [
        {
          "link": "example.com",
          "title": "title",
          "scores": [
            {
              "score": 1.0000000000000002,
              "sentence": "sentence one"
            }
          ],
          "timestamps": {
            "date_modified": "2024-02-26",
            "date_published": "2024-02-26"
          }
        }
      ]
    },
    
    // Additional results here
    
  ],
  "credits_used": 10,
  "credits": 123,
  "subscription": 123,
  "content": "content here",
  "id": [id]
}
```


# Content Processing

Content Processing Steps provide essential text transformation and organization capabilities that streamline your content workflows.

The Content Processing Steps include:

1. [**Convert PDF URL to Text**](/actions/workflow-concepts/workflow-steps/content-processing/convert-pdf-url-to-text) -- extract readable text content from PDF documents via URL
2. [**Group Keywords into Clusters** ](/actions/workflow-concepts/workflow-steps/content-processing/group-keywords-into-clusters)-- organize keyword lists into thematic clusters for better content planning


# Convert PDF URL to Text

The "Convert PDF URL to Text" step allows you to extract the textual content from a PDF document available at a specified URL. This powerful tool enables you to analyze, process, and work with text content from PDFs without manual copying or extraction.

### How to Configure the Convert PDF URL to Text Step

* **PDF URL**: Enter the full URL of the PDF document you want to convert to text.

{% hint style="info" %}
Important: The URL must point directly to a PDF file that is publicly accessible. Password-protected PDFs cannot be processed.
{% endhint %}

### Output Format

The Convert PDF URL to Text step returns the extracted text:

```
AirOps Platform Updates

Hi there,
We're kicking off the year with updates that streamline how you create and manage content pipelines in AirOps. We've improved our CMS and SERP analytics integrations, introduced more online LLMs, and built smarter troubleshooting helpers to simplify your workflow development. Let's dive in!

...
```


# Group Keywords into Clusters

The "Group Keywords into Clusters" step allows you to organize a list of keywords into meaningful, thematic clusters based on semantic similarity. This powerful tool helps you identify related keyword groups for content planning and optimization.

### How to Configure the Group Keywords into Clusters Step

* **Keywords**: List of keywords to be clustered as a JSON array (i.e. \["keyword a", "keyword b"]
* **Clustering Sensitivity**: Choose how sensitive you want the clustering logic to be:
  * Low = lower number of clusters (more coarse clustering)
  * High = higher number of clusters (more fine clustering)

### Output Format

The Group Keywords into Clusters step returns a JSON object containing the organized keyword clusters:

```json
[
 [
  "keyword 1",
  "keyword 2",
  "keyword 3",
  "keyword 4",
  "keyword 5",
  "keyword 6",
  "keyword 7"
 ],
 [
  "keyword 8",
  "keyword 9",
  "keyword 10",
  "keyword 11",
  "keyword 12",
  "keyword 13",
  "keyword 14"
 ],
 // Additional keyword clusters here
]
```


# SEO Research

SEO Research Steps provide comprehensive search intelligence tools to power your content strategy and organic growth initiatives. These steps connect directly to leading SEO platforms, giving you access to valuable keyword, competitor, and performance data within your workflows.

The SEO Research Steps include:

1. [**Moz**](/actions/workflow-concepts/workflow-steps/seo-research/moz) -- access domain authority and link metrics
2. [**DataForSEO Steps**](/actions/workflow-concepts/workflow-steps/seo-research/content-+-seo)
   1. **Keyword Ideas from Domain** -- discover potential keywords that a domain could target
   2. **Keyword Ranked For** -- identify keywords a domain currently ranks for and their metrics
   3. **News Research** -- find keyword mentions in recent news articles
   4. **Related Keyword Finder** -- uncover semantically related keywords
   5. **Related Searches Finder** -- access Google's related search suggestions
   6. **Web Research** -- retrieve keyword-relevant content snippets from the web
   7. **On-Page SEO Analysis** -- analyze a URL's SEO structure and content
3. [**Google Search Console**](/actions/workflow-concepts/workflow-steps/seo-research/google-search-console) -- retrieve search performance data and indexing status

These steps can be combined with other AirOps capabilities to automate SEO research, build data-driven content strategies, identify competitive gaps, and optimize existing content for better search performance.


# Moz

Access domain authority and SEO metrics from Moz

The Moz Integration step allows you to access Moz's SEO metrics and domain authority data within your AirOps workflows. This integration provides valuable insights for competitive analysis and SEO strategy.

## Overview

Moz is a leading SEO software platform that provides domain authority scores, link metrics, and keyword data. By using Moz in AirOps, you can incorporate authoritative SEO metrics into your content and research workflows.

## Available Actions

* **Get Related Keyword Ideas** -- get related keyword ideas and suggestions for any target keyword
* **Get Page / Domain Authority** -- get Domain Authority, Page Authority, Spam Score, and link metrics for any URL
* **Get Keyword Metrics** -- get keyword difficulty, search volume, organic CTR, and priority scores for any keyword

## Common Use Cases

* Analyzing competitor domain strength
* Evaluating link building opportunities
* Monitoring domain authority changes
* Incorporating authority metrics into content strategies


# DataForSEO

Additional data retrieval to optimize your searches

DataForSEO steps provide comprehensive SEO data and research capabilities within your workflows. These powerful tools help you discover keyword opportunities, analyze domain rankings, and gather content insights to inform your SEO and content strategies.

### Available DataForSEO Steps

AirOps offers the following DataForSEO steps:

* [**Keyword Ideas from Domain**](#keyword-ideas-from-domain) -- discover potential keywords that a domain could target
* [**Keyword Ranked For**](#keyword-ranked-for) -- identify keywords a domain currently ranks for and their metrics
* [**News Research**](#news-research) -- find keyword mentions in recent news articles
* [**Related Keyword Finder**](#related-keyword-finder) -- uncover semantically related keywords
* [**Related Searches Finder**](#related-searches-finder) -- access Google's related search suggestions
* [**Web Research**](#web-research) -- retrieve keyword-relevant content snippets from the web
* [**On-Page SEO Analysis**](#on-page-seo-analysis) -- analyze a URL's SEO structure and content

### Keyword Ideas from Domain

This step helps you discover potential keywords that a domain could target, revealing new content opportunities.

**Configuration**

* **Domain**: Enter the domain you want to analyze
* **Search Location (Optional)**: Specify the geographic location for search results (Default: United States)
* **Language (Optional)**: Select the language for search results (Default: English)
* **Output Format (Optional)**: Choose the format for returned data (Default: Markdown)
* **Number of Results (Optional)**: Determine how many search results to return (Default: 100)

**Output Format**

```json
# Keyword Ideas for example.com
    
      #### Keyword: ai tools
    
      - **Search Volume:** 120000
      - **Competition Level:** MEDIUM
      - **Competition Index:** Not Available
      ---

      #### Keyword: ai websites
    
      - **Search Volume:** 27100
      - **Competition Level:** MEDIUM
      - **Competition Index:** Not Available
      ---
      
// Additional results here

```

### Keyword Ranked For

This step helps you identify keywords a domain currently ranks for and their metrics, providing valuable insights into a website's organic search visibility.

**Configuration**

* **Domain**: Enter the domain you want to analyze
* **Brand (Optional)**: If added, will only return non-branded keywords
* **Search Location (Optional):** Specify the geographic location for search results (Default: United States)
* **Language (Optional)**: Select the language for search results (Default: English)
* **Output Format (Optional)**: Choose the format for returned data (Default: Markdown)
* **Number of Results (Optional)**: Determine how many search results to return (Default: 100)

**Output Format**

```json
  #### Keyword: keyword1

  - **Search Volume:** 1600
  - **Competition Level:** LOW
  - **Current Rank:** 1
  ---

  #### Keyword: keyword2

  - **Search Volume:** 50
  - **Competition Level:** LOW
  - **Current Rank:** 1
  ---

  // Additional results here
 
```

### News Research

This step allows you to find keyword mentions in recent news articles, helping you discover trending stories and topics related to your target keywords.

**Configuration**

* **News Search**: Searches current news for the provided search term
* **Search Location (Optional):** Specify the geographic location of your search (Default: United States)
* **Search Language (Optional)**: Select the language of your search (Default: English)
* **Output Format (Optional)**: Choose the format for returned data (Default: Markdown)

**Output Format**

```json
# Live Google News "keyword"

- **Type:** news_search
- **Domain:** www.businesswire.com
- **Title:** Accuris Partners with Citation Compliance to Enhance Engineering Workbench and Accuris Thread with Regulatory Content
- **URL:** https://www.businesswire.com/news/home/20250225787473/en/Accuris-Partners-with-Citation-Compliance-to-Enhance-Engineering-Workbench-and-Accuris-Thread-with-Regulatory-Content
- **Snippet:** Accuris, the market leader in engineering standards content and technology, today announced it will be adding a comprehensive set of...
---

- **Type:** news_search
- **Domain:** www.tvtechnology.com
- **Title:** C2HR: Broadcast Engineering Among Hottest Jobs in Content Development
- **URL:** https://www.tvtechnology.com/news/c2hr-broadcast-engineering-among-hottest-jobs-in-content-development
- **Snippet:** Broadcast techs saw a 25% boost in their pay in 2024, according to annual survey.
---

  // Additional results here
  
```

### Related Keyword Finder

This step helps you uncover semantically related keywords that are closely associated with your target keyword, expanding your keyword portfolio with relevant terms.

**Configuration**

* **Keyword**: Enter the primary keyword or phrase
* **Location (Optional):** Specify the geographic location for search results (Default: United States)
* **Language (Optional)**: Select the language for search results (Default: English)
* **Output Format (Optional)**: Choose the format for returned data (Default: Markdown)

**Output Format**

```json
Keyword Ideas for "keyword"

#### Keyword: related keyword one

- **Competition:** 0.07
- **Competition Level:** LOW
- **Search Volume:** 823000
---


#### Keyword: related keyword two

- **Competition:** 0.04
- **Competition Level:** LOW
- **Search Volume:** 823000
---

  // Additional results here

```

### Related Searches Finder

This step allows you to access related search suggestions.

**Configuration**

* **Keyword**: Enter the primary keyword or phrase
* **Search Location (Optional):** Specify the geographic location for search results (Default: United States)
* **Search Language (Optional)**: Select the language for search results (Default: English)
* **Output Format (Optional)**: Choose the format for returned data (Default: Markdown)

**Output Format**

```json
Related Keywords for "keyword"

Keyword: keyword one
Competition: 0.04
Competition Level: LOW
Search Volume: 3600
Related Keywords: 7 types of marketing, 10 types of marketing, 12 types of marketing, what are the 4 types of marketing?, 7 types of marketing with examples, 3 types of marketing, types of marketing pdf, types of marketing in economics

Keyword: keyword two
Competition: 0.04
Competition Level: LOW
Search Volume: 590
Related Keywords: 5 examples of marketing, example of marketing plan, example of marketing in business, example of marketing mix, example of marketing definition, example of marketing for students, example of marketing management, what is marketing

  // Additional results here

```

### Web Research

This step helps you retrieve keyword-relevant content snippets from the web, analyzing what successful content contains and gathering insights for your own content creation.

**Configuration**

* **Search Phrase**: Enter the search term or phrase you want to research
* **Limit** (Optional): The maximum number of returned citations, defaults to 25
* **Offset** (Optional)
* **Output Format (Optional)**: Choose the format for returned data (Default: Markdown)
* **Location (Optional):** Specify the geographic location for search results

**Output Format**

```json
Web research for: keyword

Title: [snippet title]
Type: content_analysis_search
URL: https://www.example.com/keyword
Snippet: [content snipped]
Date Published: 2024-09-19 12:16:00 +00:00

Title: [snippet title]
Type: content_analysis_search
URL: https://www.example.com/keyword
Snippet: [content snipped]
Date Published: 2024-09-19 12:16:00 +00:00

  // Additional results here
  
```

### On-Page SEO Analysis

This step enables you to analyze a URL's SEO structure and content.

**Configuration**

* **Page URL**: Enter the complete URL of the page you want to analyze
* **Enable Javascript? (Optional)**: Load javascript on the page to render dynamic content (Default: False)
* **Check page spelling? (Optional)**: Return potentially incorrect spellings found on the page (Default: True)
* **Output Format (Optional)**: Select the format for returned data (Default: Markdown)

**Output Format**

```json
# Page Evaluation
Page load time: 1.5 sec. sec  
URL of the page: example.com
Crawl progress:   



  # Metadata Information
  Meta Title: Example - Example meta title
  Meta Description: Example meta description here
  Meta Charset: 60000  
  Meta Keywords:  
  Canonical URL: example.com  



    # Social Media Tags
    og:title: Example - example title    
    og:description: Example meta description here


    # Performance Metrics
    Page Loading Time: 288 ms  
    DOM Complete Time: 288 ms  
    Largest Contentful Paint: 0 ms  



    # SEO Checks
    Page is redirected: false  
    Page loading time is high: false  
    Page is broken: false  
    Page has high content rate: false  



    # All h1 Tags
    
    - Example h1 tag
    


    # All h2 Tags
    
    - First example h2
    
    - Second example h2
    
    ...
    

    # All  Misspelled Words
    
    - word
    - word
    - word
    - word
    ...


    # Render Blocking Scripts Count
    Render Blocking Scripts Count: 3


    # All Resource Errors 
    
    Line: 563 - Message: The closing tag and the currently open tag do not match.  
     
    
    ...
```


# Google Search Console

<figure><img src="/files/2CZj5MmSzaAz19GNVB1x" alt=""><figcaption></figcaption></figure>

AirOps allows you to connect directly to your Google Search Console account to get valuable search performance data within your workflows, helping you make data-driven decision with your content.

### How to Configure the Google Search Console Integration Step

1. **Add the step to your workflow**:
   * Click the "+" button to add a new step
   * Select "Google Search Console" under the "Integrations" section from the available steps
2. **Authentication**:
   * Select an existing Google Search Console connection from the dropdown, or set up a new one
3. **Action Type**:
   * Choose from the following available actions:
     * **Get Query Performance Overview**: Retrieves performance data for search queries that led to your site
     * **Get Page Performance Overview**: Retrieves performance data for specific pages on your site
     * **Get Query Page Performance Breakdown**: Provides detailed performance metrics between queries and pages
     * **Get Page Indexing Status**: Checks if a specific URL is indexed by Google and when it was last indexed
4. **Configure action-specific parameters**:
   * **Site Selection**: Choose which Google Search Console property to query
   * **URL**: For page-specific actions, enter the URL you want to analyze
   * **Period**: For performance data, select the time frame from preset options:
     * Last 7 days
     * Last 28 days
     * Last 30 days
     * Last 60 days
     * Last 90 days
     * Last 3 months
     * Custom date range
5. **Output formats vary by action type**:
   * **Query Performance**: Returns data including query text, clicks, impressions, CTR, and position in the following JSON format

```
{
  "queries": [
    {
      "query": "string",  // The search query text
      "clicks": number,   // Count of clicks from this query
      "impressions": number,  // Count of impressions for this query
      "ctr": number,      // Click-through rate (decimal format)
      "position": number  // Average position in search results
    }
    // Multiple query objects will be returned
  ]
}
```

* **Page Performance**: Returns data about specific pages including clicks, impressions, and ranking

```
{
  "clicks": {
    "L7D": number,       // Total clicks in the Last 7 Days
    "L30D": number,      // Total clicks in the Last 30 Days
    "WoW Change": number, // Week-over-Week change in clicks (can be positive or negative)
    "MoM Change": number  // Month-over-Month change in clicks (can be positive or negative)
  },
  "impressions": {
    "L7D": number,       // Total impressions in the Last 7 Days
    "L30D": number,      // Total impressions in the Last 30 Days
    "WoW Change": number, // Week-over-Week change in impressions
    "MoM Change": number  // Month-over-Month change in impressions
  },
  "ctr": {
    "L7D": number,       // Average Click-Through Rate for the Last 7 Days (expressed as percentage)
    "L30D": number,      // Average Click-Through Rate for the Last 30 Days (expressed as percentage)
    "WoW Change": number, // Week-over-Week change in CTR (percentage points)
    "MoM Change": number  // Month-over-Month change in CTR (percentage points)
  },
  "position": {
    "L7D": number,       // Average position in search results for the Last 7 Days
    "L30D": number,      // Average position in search results for the Last 30 Days
    "WoW Change": number, // Week-over-Week change in position (negative change is improvement)
    "MoM Change": number  // Month-over-Month change in position (negative change is improvement)
  }
}
```

* **Query Page Breakdown**: Shows how specific queries perform for specific pages

```
{
  "queries": [  // Array of query objects
    {
      "query": "string",     // The specific search query text being analyzed
      "clicks": number,      // Total clicks received from this query across all pages
      "impressions": number, // Total impressions for this query across all pages
      "ctr": number,         // Overall click-through rate for the query (expressed as percentage)
      "position": number,    // Average position in search results for this query
      
      "ranking_pages": [     // Array of pages that rank for this query
        {
          "url": "string",   // Full URL of the ranking page
          "clicks": number,  // Number of clicks this specific page received for this query
          "impressions": number, // Number of impressions this page received for this query
          "ctr": number,     // Page-specific click-through rate (expressed as decimal)
          "position": number, // Average position of this page for this query
          "clicks_percent_total": number, // Percentage of total query clicks going to this page
          "impressions_percent_total": number // Percentage of total query impressions going to this page
        }
        // Multiple page objects will be returned, sorted by clicks in descending order
      ]
    },
    // Multiple query objects will be returned, typically sorted by clicks in descending order
  ],
  
  "metadata": {
    "start_date": "string", // ISO format date marking the beginning of the reporting period
    "end_date": "string",   // ISO format date marking the end of the reporting period
    "queries": number,      // Total number of unique queries analyzed in this report
    "urls": number          // Total number of unique URLs that appeared in search results
  }
}
```

* **Indexing Status**: Returns whether a page is indexed, along with the last crawl date in the following JSON format

```
{
  "last_crawled_at": "string", // Timestamp of the last crawl
  "indexed": boolean           // Whether the page is indexed
}
```


# AEO Research

Access your AEO analytics directly in workflows to go from insight to action

AEO Research Steps connect your AI search visibility data directly to workflows, enabling you to transform insights into automated actions. These steps are essential for building the most comprehensive AI search optimization platform, allowing you to monitor, analyze, and act on your brand's presence across answer engines.

### Why AEO Research Steps Matter

Other tools show you AI search data in a silo. AirOps takes a different approach: **insight to action**. By bringing your AEO analytics into workflows, you can:

* **Automate competitive monitoring:** Trigger alerts or content updates based on visibility changes
* **Build content prioritization pipelines:** Use real performance data to decide what to create or refresh
* **Create custom reporting:** Combine AEO data with SEO and traffic metrics for stakeholder reports
* **Scale optimization efforts:** Process hundreds of prompts or pages programmatically

### What is Answer Engine Optimization (AEO)?

Answer Engine Optimization (AEO) is the practice of optimizing your content to appear prominently in AI-generated responses from platforms like ChatGPT, Perplexity, Gemini, Google AI Mode, and Google AI Overview. Unlike traditional SEO which focuses on ranking in search results, AEO ensures your brand gets mentioned and cited when users ask questions across AI platforms.

| Traditional SEO                   | Answer Engine Optimization (AEO)                        |
| --------------------------------- | ------------------------------------------------------- |
| Ranks pages in search results     | Gets your brand mentioned in AI answers                 |
| Focuses on keywords and backlinks | Emphasizes authoritative content and citations          |
| Targets search engine algorithms  | Optimizes for LLM training data and real-time retrieval |
| Measures clicks and impressions   | Tracks mention rates, citations, and sentiment          |

### Available Research Steps

#### 1. AEO Prompt Data

**Get historical answers, citations, and mentions for tracked prompts**

Pull data for the prompts you're tracking across answer engines. Access answers, citations, and mention rates with sentiment analysis for the last 7, 30, or 90 days.

**Use cases:**

* Monitor brand visibility trends across AI platforms
* Track competitive positioning for specific prompts
* Identify which prompts drive the most brand mentions
* Build automated competitive analysis reports

**Report types available:**

* **Answers**: Actual AI-generated response content
* **Citations**: URLs cited as authoritative sources
* **Mentions**: Brand visibility with sentiment scores

[View AEO Prompt Data documentation →](/actions/workflow-concepts/workflow-steps/aeo-research/aeo-prompt-data)

***

#### 2. AEO Page Data

**Get page-level performance data across AI search and analytics**

Pull comprehensive data for any URL, combining AI search citations with Google Search Console and Google Analytics 4 metrics. Ideal for content prioritization and refresh workflows.

**Use cases:**

* Automate content refresh decisions based on page performance
* Build prioritization workflows combining AI and SEO metrics
* Create reports tracking page-level citation trends
* Trigger optimization based on declining metrics

**Data sources included:**

* **AI Search**: Citation rate, citation share, unique prompts
* **Google Search Console**: Clicks, impressions, position, CTR
* **Google Analytics 4**: Sessions, users, engagement metrics

[View AEO Page Data documentation →](/actions/workflow-concepts/workflow-steps/aeo-research/aeo-page-data)

***

### Supported AI Platforms

Both AEO Research steps support all major AI answer engines:

| Platform               | Description                                        |
| ---------------------- | -------------------------------------------------- |
| **ChatGPT**            | OpenAI's conversational AI assistant               |
| **Perplexity**         | AI-powered answer engine with real-time web search |
| **Gemini**             | Google's multimodal AI assistant                   |
| **Google AI Mode**     | Google Search's AI-powered response mode           |
| **Google AI Overview** | AI-generated summaries in Google Search results    |

### Prerequisites

To use AEO Research steps effectively:

1. **Set up a Brand Kit:** Define your brand, competitors, and tracked prompts
2. **Connect data sources:** Link Google Search Console and GA4 for page-level data
3. **Track prompts:** Add prompts to your Brand Kit to start collecting AI visibility data

See [Brand Kits](/context/brand-kit) documentation for setup instructions.


# AEO Prompt Data

Access historical answers, citations, and mentions for the prompts you're tracking across AI answer engines.

The AEO Prompt Data step lets you pull historical brand visibility data for your tracked prompts across AI answer engines. Get comprehensive insights about how your brand appears in AI-generated responses, including answers, citations, and mentions with sentiment scores.

### Overview

**What it does:** Access answers, citations, and mentions for prompts you're tracking for your brand across answer engines like ChatGPT, Perplexity, Gemini, Google AI Mode, and Google AI Overview. Data is available for the last 7, 30, or 90 days.

**When to use it:**

* Monitor brand visibility trends across AI platforms
* Track competitive positioning in AI-generated responses
* Identify which prompts drive the most brand mentions
* Analyze sentiment shifts over time
* Build automated reports on AI search performance

**Key benefits:**

* **Go from insight to action:** Connect your AEO analytics directly to content optimization workflows
* **Unified cross-platform monitoring** across all major AI answer engines from a single workflow step
* **Competitive benchmarking** with automated sentiment analysis and mention rate comparisons
* **Flexible time ranges** to analyze trends over 7, 30, or 90 days
* **Actionable data** that feeds directly into content creation and optimization workflows

### Supported AI Platforms

The AEO Prompt Data step works with five major AI platforms:

| Platform               | Description                                        |
| ---------------------- | -------------------------------------------------- |
| **ChatGPT**            | OpenAI's conversational AI assistant               |
| **Perplexity**         | AI-powered answer engine with real-time web search |
| **Gemini**             | Google's multimodal AI assistant                   |
| **Google AI Mode**     | Google Search's AI-powered response mode           |
| **Google AI Overview** | AI-generated summaries in Google Search results    |

**Default behavior:** All platforms are selected automatically to ensure comprehensive coverage. You can filter to specific platforms using the multi-select dropdown in the step configuration.

**Data aggregation:** Results are combined across all selected platforms, giving you unified metrics rather than platform-specific siloed data.

### Available Report Types

#### 1. Answers Report

*Access actual AI-generated responses for context and positioning analysis*

**Purpose:** Review the actual content of AI responses to understand how your brand is positioned, what context it appears in, and identify opportunities for improvement.

#### Report Fields

| Field    | Type   | Description                                                                    | Format                |
| -------- | ------ | ------------------------------------------------------------------------------ | --------------------- |
| `answer` | String | Complete AI-generated response text (truncated at 10,000 characters if needed) | Full response content |
| `date`   | String | When the AI response was generated                                             | MM-DD-YYYY            |

#### Understanding the Data

* **Content Analysis**: Examine how AI platforms describe your brand, products, or services in their responses
* **Contextual Positioning**: Understand what topics and questions trigger mentions of your brand
* **Competitive Framing**: See how you're positioned relative to competitors in direct comparisons
* **Messaging Consistency**: Identify variations in how your brand is described across different prompts

#### Sample Response

```json
[
  {
    "answer": "TechCorp offers enterprise-grade solutions with advanced security features, making it a popular choice for large organizations. Their API integration capabilities and customer support are frequently mentioned as key differentiators in the project management space.",
    "date": "01-15-2026"
  },
  {
    "answer": "For small businesses looking at project management tools, options include TechCorp, CompetitorA, and CompetitorB. TechCorp tends to be recommended for teams that need extensive customization and have technical resources available.",
    "date": "01-14-2026"
  }
]
```

***

#### 2. Citations Report

*Monitor which URLs are referenced as authoritative sources*

**Purpose:** Track which URLs are being cited by AI platforms as authoritative sources for specific prompts, ranked by how frequently they appear across AI responses.

#### Report Fields

| Field           | Type   | Description                                             | Notes                               |
| --------------- | ------ | ------------------------------------------------------- | ----------------------------------- |
| `url`           | String | The complete URL being cited (query parameters removed) | Each URL appears only once          |
| `citation_rate` | Float  | Frequency this URL appears in answers with citations    | 0.0 to 1.0 (higher = more frequent) |

#### Understanding the Data

* **Citation Rate:** Defined as *(number of answers citing this URL) / (number of answers containing at least one citation).* A citation rate of 0.67 means this URL appeared in 67% of responses that included citations.
* **URL Normalization**: Query parameters are automatically stripped from URLs to avoid duplicate entries
* **Authority Ranking**: Results are sorted by citation rate (descending), showing which sources AI platforms reference most frequently

#### Sample Response

```json
[
  {
    "url": "https://techcorp.com/enterprise-security-guide",
    "citation_rate": 0.67
  },
  {
    "url": "https://techcorp.com/api-documentation",
    "citation_rate": 0.33
  },
  {
    "url": "https://competitor.com/industry-report-2026",
    "citation_rate": 0.33
  }
]
```

***

#### 3. Mentions Report

*Track brand and competitor visibility with sentiment analysis*

**Purpose:** Monitor how frequently your brand and competitors appear in AI responses for specific prompts, with automated sentiment scoring to understand perception trends.

#### Report Fields

| Field            | Type   | Description                                   | Range/Format                              |
| ---------------- | ------ | --------------------------------------------- | ----------------------------------------- |
| `brand_name`     | String | Brand or competitor name from your Brand Kit  | Domain's name field                       |
| `mention_rate`   | Float  | Relative frequency of mentions for this brand | 0.0 to 1.0 (proportion of total mentions) |
| `sentiment_rate` | Float  | Average sentiment score of mentions           | -1.0 to 1.0 (-1 = negative, 1 = positive) |

#### Understanding the Data

* **Mention Rate:** Calculated as (this brand's mentions) / (total mentions across all brands). A rate of 0.25 means this brand accounts for 25% of all brand mentions in the analyzed responses.
* **Sentiment Rate:** Averaged across all mentions using sentiment analysis. Values range from -1.0 (completely negative) to 1.0 (completely positive), with 0.0 being neutral.
* **Competitive Context:** Results are sorted by mention rate (descending), allowing you to quickly identify brands with the largest share of voice.

#### Sample Response

```json
[
  {
    "brand_name": "TechCorp",
    "mention_rate": 0.42,
    "sentiment_rate": 0.65
  },
  {
    "brand_name": "CompetitorA",
    "mention_rate": 0.31,
    "sentiment_rate": 0.45
  },
  {
    "brand_name": "CompetitorB",
    "mention_rate": 0.27,
    "sentiment_rate": -0.15
  }
]
```

### Step Configuration Guide

When setting up your **AEO Prompt Data** step, configure these fields:

#### 1. Report Type *(Required)*

**Description:** Choose the type of analysis you want to perform.

**Options:**

* **Answers**: Access actual AI response content for positioning analysis
* **Citations**: Track which URLs are cited as authoritative sources
* **Mentions**: Monitor brand visibility with sentiment analysis

#### 2. Platform *(Multi-select)*

**Description:** Select which AI platforms to include in your analysis.

**Options:** ChatGPT, Perplexity, Gemini, Google AI Mode, Google AI Overview (all selected by default)

#### 3. Brand Kit *(Required)*

**Description:** Select the [Brand Kit](/context/brand-kit) containing your brand information and competitor list. This determines which brands are analyzed and compared.

#### 4. Question *(Required)*

**Description:** Select a tracked prompt/question from your Brand Kit to analyze. This focuses the analysis on a specific prompt that you're monitoring.

#### 5. Time Range *(Required)*

**Description:** Determines the date range for the data.

**Options:**

* **Last 7 days**: Most recent snapshot of AI visibility
* **Last 30 days**: Monthly trend analysis
* **Last 90 days**: Quarterly performance review

### Use Cases

#### Content Optimization Pipeline

Pull prompt data to identify gaps in AI responses, then trigger content creation or refresh workflows:

1. Use AEO Prompt Data to find prompts where competitors are mentioned more frequently
2. Route to a content analysis step to identify missing topics
3. Generate optimized content targeting those prompts

#### Competitive Monitoring Dashboard

Build automated reports that track competitive positioning:

1. Pull mentions data across key prompts
2. Compare sentiment rates between your brand and competitors
3. Output to Google Sheets or Notion for stakeholder review

#### Citation Authority Tracking

Monitor which content performs best in AI citations:

1. Pull citations data for high-priority prompts
2. Identify your most-cited URLs
3. Analyze patterns to inform content strategy


# AEO Page Data

Access page-level citation and performance data from your tracked pages across AI search and traditional analytics.

The AEO Page Data step lets you pull page-level analytics data directly into your workflows. Access citation rates, traffic metrics, and search performance for any URL you're tracking, combining AI search visibility with Google Analytics and Search Console data.

### Overview

**What it does:** Get comprehensive page-level data for any URL across AI search, Google Analytics 4, and Google Search Console. This step connects your [Pages](/insights/onsite/pages) data directly to workflows, enabling you to act on insights programmatically.

**When to use it:**

* Automate content refresh decisions based on page performance
* Build prioritization workflows that combine AI and SEO metrics
* Create reports that track page-level AI citation trends
* Trigger content optimization based on declining metrics
* Feed page data into content generation workflows

**Key benefits:**

* **Go from insight to action:** Transform your Pages analytics into automated workflows
* **Unified data access** across AI search, GSC, and GA4 from a single step
* **Page-level granularity** for precise content optimization decisions
* **Flexible time ranges** to analyze trends over 7, 30, or 90 days
* **Direct workflow integration:** Use page performance to trigger actions

### Data Sources

The AEO Page Data step combines data from three sources for each URL:

#### AI Search Data

| Metric             | Description                                                                              |
| ------------------ | ---------------------------------------------------------------------------------------- |
| **Citation Rate**  | How often this page is cited in AI responses (percentage of answers that cite this page) |
| **Citation Share** | This page's portion of total citations across all your tracked pages                     |
| **Citations**      | Total number of times your page is referenced in AI responses                            |
| **Unique Prompts** | Number of distinct prompts where this page has been cited                                |

#### Google Search Console Data

| Metric               | Description                                                        |
| -------------------- | ------------------------------------------------------------------ |
| **Clicks**           | Total clicks from organic search                                   |
| **Impressions**      | Number of times your page appeared in search results               |
| **Average Position** | Your average ranking position                                      |
| **CTR**              | Click-through rate (percentage of impressions resulting in clicks) |

#### Google Analytics 4 Data

| Metric                    | Description                                 |
| ------------------------- | ------------------------------------------- |
| **Sessions**              | Total session count for the page            |
| **Users**                 | Number of unique users who visited the page |
| **Avg. Session Duration** | How long users spend on the page            |
| **Engagement Rate**       | Percentage of engaged sessions              |

### Supported AI Platforms

Data is aggregated across all major AI platforms:

| Platform               | Description                                        |
| ---------------------- | -------------------------------------------------- |
| **ChatGPT**            | OpenAI's conversational AI assistant               |
| **Perplexity**         | AI-powered answer engine with real-time web search |
| **Gemini**             | Google's multimodal AI assistant                   |
| **Google AI Mode**     | Google Search's AI-powered response mode           |
| **Google AI Overview** | AI-generated summaries in Google Search results    |

You can filter to specific platforms using the multi-select dropdown in the step configuration.

### Step Configuration Guide

When setting up your **AEO Page Data** step, configure these fields:

#### 1. Page URL *(Required)*

**Description:** The URL of the page you want to analyze. This should be a page that exists in your [Pages](/insights/onsite/pages) view.

**Format:** Full URL including protocol (e.g., `https://example.com/your-page`)

**Tips:**

* Use Liquid templating to dynamically pass URLs from previous steps
* Reference URLs from Grid columns for bulk processing

#### 2. Brand Kit *(Required)*

**Description:** Select the [Brand Kit](/context/brand-kit) associated with this page's tracking. The Brand Kit determines which prompts and competitors are relevant for the analysis.

#### 3. Platform *(Multi-select)*

**Description:** Select which AI platforms to include in the citation analysis.

**Options:** ChatGPT, Perplexity, Gemini, Google AI Mode, Google AI Overview (all selected by default)

#### 4. Time Range *(Required)*

**Description:** Determines the date range for citation and prompt data.

**Options:**

* **Last 7 days**: Most recent snapshot
* **Last 30 days**: Monthly trend analysis
* **Last 90 days**: Quarterly performance review

### Sample Response

```json
{
  "url": "https://techcorp.com/enterprise-security-guide",
  "ai_search": {
    "citation_rate": 0.42,
    "citation_share": 0.15,
    "total_citations": 127,
    "unique_prompts": 23
  },
  "gsc": {
    "clicks": 4521,
    "impressions": 89432,
    "average_position": 4.2,
    "ctr": 0.051
  },
  "ga4": {
    "sessions": 5234,
    "users": 4102,
    "avg_session_duration": 184,
    "engagement_rate": 0.68
  },
  "prompts": [
    {
      "prompt": "best enterprise security tools 2026",
      "citation_rate": 0.73,
      "mention_rate": 0.45
    },
    {
      "prompt": "how to secure enterprise data",
      "citation_rate": 0.58,
      "mention_rate": 0.32
    }
  ]
}
```

### Use Cases

#### Content Refresh Prioritization

Build workflows that automatically identify pages needing attention:

1. Pull page data for URLs from a Grid
2. Filter for pages with declining citation rates but strong SEO metrics
3. Route to content analysis and refresh workflows

#### Performance-Based Content Updates

Trigger content updates based on real performance data:

1. Pull page data and check citation rate trends
2. If citation rate dropped >20%, analyze competitor content
3. Generate content recommendations or refreshed content

#### Multi-Channel Reporting

Create comprehensive page performance reports:

1. Pull page data for key URLs
2. Combine AI search, SEO, and traffic metrics
3. Output to Google Sheets for stakeholder review
4. Schedule weekly updates via workflow triggers

#### Gap Analysis Workflows

Identify pages with untapped AI potential:

1. Pull page data for high-SEO-traffic pages
2. Filter for low citation rates
3. Analyze what's missing for AI visibility
4. Generate optimization recommendations

### Best Practices

**Start with your highest-value pages:** Focus on pages that drive significant organic traffic or conversions first.

**Combine with AEO Prompt Data:** Use both steps together. AEO Prompt Data for prompt-level competitive analysis, AEO Page Data for page-level performance tracking.

**Set up regular monitoring:** Schedule workflows to run weekly or monthly to track trends over time.

**Use time range strategically:** Use 7-day data for rapid iteration, 30-day for monthly reviews, and 90-day for quarterly planning.


# Content Updates

Track and record page-level content updates for AEO and SEO Insights

Content Update steps allow you to record page-level activity, such as publishing or refreshing a page, directly from your workflows. These content updates feed into [Content Updates](/insights/onsite/content-updates), giving you visibility into how your content publishing activity correlates with SEO and AEO performance.

The Content Update steps include:

1. [**Track Content Update**](/actions/workflow-concepts/workflow-steps/content-updates/track-content-update) - record a page publish or refresh content update for a Brand Kit

{% hint style="info" %}
Some native CMS integration steps (WordPress, Webflow, Shopify, Ghost) capture page content updates automatically. For those integrations, you do not need to add a Track Content Update step. See [Content Updates](/insights/onsite/content-updates) for the full list of supported integrations.
{% endhint %}

Content Update steps are intended for workflows that create or update webpage content without using a native CMS step, for example when you use a Code step or Call API step to push content to an external CMS. In those cases, AirOps has no built-in way to detect the publish or refresh, so the Track Content Update step lets you log it explicitly.


# Track Content Update

Track page publish and refresh content updates for AEO and SEO Insights

## What is the Track Content Update Step?

The Track Content Update step records page-level content updates, such as when a page is published or refreshed, directly from your workflow. These content updates feed into [Content Updates](/insights/onsite/content-updates), giving you visibility into your content publishing activity across all the pages tracked by your Brand Kits.

{% hint style="info" %}
Some native CMS integration steps (WordPress, Webflow, Shopify, Ghost) capture page content updates automatically. For those integrations, you do not need to add a Track Content Update step. See [Content Updates](/insights/onsite/content-updates) for the full list.
{% endhint %}

### When to Use the Track Content Update Step

When your workflows create or update webpage content using a Code step, Call API step, or any other non-native CMS approach, AirOps has no built-in way to detect that a page was published or refreshed. The Track Content Update step closes this gap by letting you explicitly log these content updates as part of your workflow.

Use it when you:

* **Push content via a Code step or API call** to a CMS that doesn't have a native AirOps integration
* **Publish new pages** through a workflow and want Insights to start tracking that page immediately
* **Refresh existing content** and want to record when the update happened so you can measure its impact on SEO and AEO performance

***

## How to Configure

### Type

Select the type of content update you want to record:

* **Page Published** - use this when a new page is being created and published for the first time
* **Page Refreshed** - use this when an existing page is being updated with new or revised content

### URL

Enter the full URL of the page being published or refreshed. This field supports [Liquid templating](/actions/workflow-concepts/liquid-template), so you can reference outputs from previous steps.

For example, if a prior step returns the published page URL:

```
{{ publish_step.output.url }}
```

**URL requirements:**

* Must be a full URL (e.g., `https://example.com/blog/my-post`)
* The URL domain must match a [Brand Kit](/context/brand-kit) domain in your workspace. The step automatically resolves the matching Brand Kit(s) from the URL, and records a content update for each one that matches.

### Custom Attributes

Add up to 20 key-value pairs of custom metadata to the content update. Both keys and values support [Liquid templating](/actions/workflow-concepts/liquid-template).

Custom attributes appear alongside system metadata in the [Content Updates](/insights/onsite/content-updates) table and page detail view. Use them to tag content updates with additional context, for example the workflow name, content author, or CMS status.

### Soft Fail

When enabled (the default), the workflow continues even if this step fails. This prevents a tracking failure from interrupting your content publishing workflow.

***

## Output

The Track Content Update step outputs the content updates it recorded — one entry per matching Brand Kit — along with the custom attributes applied:

```json
{
  "events": [
    {
      "id": 12345,
      "brand_kit_id": 678,
      "brand_kit_name": "Example (US)"
    }
  ],
  "custom_attributes": {
    "author": "jane"
  }
}
```

When the page URL matches more than one Brand Kit, `events` contains an entry for each. Reference a specific record downstream with Liquid, for example `{{ track_step.output.events[0].id }}`.

***

## Example Use Case

A common pattern is to pair the Track Content Update step with a Code step or Call API step that publishes content:

1. **Prompt LLM** - generate or refresh article content
2. **Code Step** - call your CMS API to publish the content to your website
3. **Track Content Update** - record the publish so Insights can track the page

This way, every time your workflow publishes content through a custom integration, the content update is logged and reflected in your Insights dashboard.


# B2B Enrichment

B2B Enrichment Steps provide powerful data retrieval capabilities to enhance your outbound marketing, sales, and research workflows. These tools allow you to access comprehensive company and contact information to build more targeted and personalized business strategies.

The B2B Enrichment Steps include:

1. [**Brandfetch**](/actions/workflow-concepts/workflow-steps/b2b-enrichment/brandfetch) -- retrieve brand assets, logos, and company information
2. [**G2**](/actions/workflow-concepts/workflow-steps/b2b-enrichment/g2) -- retrieve product listings, review answers, and survey responses from G2
3. [**Hunter.io Steps**](/actions/workflow-concepts/workflow-steps/b2b-enrichment/contact-enrichment)
   1. **Hunter.io Domain Email Search** -- discover email addresses associated with a specific domain
   2. **Hunter.io Email Verifier** -- validate email deliverability to reduce bounce rates
   3. **Hunter.io Person Email Search** -- find specific individuals' email addresses at companies
4. [**People Data Labs Steps**](/actions/workflow-concepts/workflow-steps/b2b-enrichment/people-data-labs)
   1. **People Data Labs - Company Enrichment** -- access detailed company information including funding, size, and industry data
   2. **People Data Labs - Person Enrichment** -- gather comprehensive professional profiles including work history and contact details

These steps can be combined with other AirOps capabilities to automate lead enrichment, personalize outreach campaigns, conduct competitive research, and build more robust contact databases for your B2B initiatives.

{% hint style="info" %}
Note: B2B Enrichment Steps are primarily designed for Workflow applications. Some steps may have limited functionality when used in Agents.
{% endhint %}


# Brandfetch

Enrich company data with Brandfetch

The Brandfetch Integration step allows you to retrieve comprehensive brand information including logos, colors, and company data within your AirOps workflows. This integration enables automated brand asset retrieval for content personalization and company research.

## Overview

Brandfetch provides access to brand assets and company information including logos, colors, fonts, and company details. By connecting Brandfetch to AirOps, you can automatically enrich your workflows with brand data for personalization and research.

## Authentication

Before using the Brandfetch integration in your workflows, you must first connect your Brandfetch account in the AirOps Settings:

1. Navigate to **Settings > Integrations**
2. Find the Brandfetch section and click "Configure"
3. Enter your Brandfetch API key
4. Complete the authentication process

## Available Actions

* **Company Enrichment** -- retrieve comprehensive brand and company information for a given company URL, including logos, colors, fonts, and company details

## Common Use Cases

* Personalizing outreach with company logos
* Creating branded content and proposals
* Enriching CRM data with brand assets
* Building company profile pages automatically

{% hint style="info" %}
Note: Brandfetch API access requires a Brandfetch subscription. Check your plan for API usage limits and available data.
{% endhint %}


# G2

Integrate your Workflow with G2

The G2 Integration step allows you to connect your AirOps workflows directly with your G2 account. This integration enables you to pull product data, reviews, and survey questions from G2 programmatically.

{% hint style="info" %}
This integration connects to G2's **Data API**, which is a separate, paid G2 product. It is not the same as the public g2.com website, and it only returns the products your G2 account is licensed to access. Being able to find a product on g2.com does not mean it is available through the API. If your G2 plan does not include Data API access, or no products are mapped to your account, actions will return no results. Confirm your access with your G2 administrator.
{% endhint %}

## How to Configure the G2 Integration Step

### Authentication

Before using the G2 integration in your workflows, you must first connect your G2 account in the AirOps Settings:

1. Open **Settings → Integrations**.
2. Find the **G2** section and click **Configure**.
3. Complete the OAuth authentication process by granting AirOps the necessary permissions.

### MCP Connectors and Playbooks

You can also connect G2 through **Settings → MCP Connectors** and use it in Playbooks. AirOps uses its OAuth app for the standard connector flow.

1. Open **Settings → MCP Connectors** and connect **G2**.
2. Open the Playbook editor.
3. Open the **Tools** panel and turn on **G2**.
4. Describe what G2 review data the Playbook should use during the content creation run.

<details>

<summary>Use your own G2 OAuth app</summary>

If your team uses its own scoped OAuth app, complete the advanced setup before you continue the G2 OAuth flow in AirOps.

1. In My.G2, open your G2 OAuth app and find the client ID and secret ID.
2. In AirOps, paste both values into **Advanced OAuth client settings**.
3. Click **Save**, then copy the AirOps callback URL: `https://app.airops.com/api/mcp_connectors/oauth/callback`.
4. Return to the G2 OAuth app in My.G2 and add the callback URL to the redirect URIs.
5. Return to AirOps and continue the OAuth flow.

</details>

### Action Types

The G2 Integration supports the following actions:

* **Get Products**: Retrieve a list of products listed on G2
* **Search Products**: Search for G2 products by keyword or topic
* **Get Survey Questions**: Retrieve the definitions of the questions G2 asks in product surveys. This does not return review answers. Use **Get Reviews** for the written feedback reviewers left.
* **Get Reviews**: Retrieve reviews for a specific product

### Action-Specific Parameters

**Get Products**

* **Product Name (Optional)**: Filter by exact product name (e.g. `Salesforce`)
* **Slug (Optional)**: Filter by G2 product URL slug (e.g. `salesforce-crm`)
* **Search Query (Optional)**: Free-text search across product names (e.g. `CRM`)
* **Page Size (Optional)**: Number of results per page (max 100, default 10)
* **Page Number (Optional)**: Page number to retrieve (default 1)

**Search Products**

* **Keyword (Required)**: Search for G2 products by keyword or topic (e.g. `CRM`, `project management`)
* **Page Size (Optional)**: Number of results per page (max 100, default 10)
* **Page Number (Optional)**: Page number to retrieve (default 1)

**Get Survey Questions**

* **Updated After (Optional)**: Return questions updated after this date (RFC3339 format, e.g. `2024-01-01T00:00:00Z`)
* **Updated Before (Optional)**: Return questions updated before this date (RFC3339 format)
* **Page Size (Optional)**: Number of results per page (max 100, default 10)
* **Page Number (Optional)**: Page number to retrieve (default 1)

**Get Reviews**

* **Product ID (Required)**: The G2 product UUID to fetch reviews for (e.g. `5079d5b8-c6f0-4b0e-96a9-44b8c9d3a6f1`). This is not the product name. To find it, run a **Get Products** or **Search Products** step first, then copy the `id` of the product you want from its results.
* **Created After (Optional)**: Return reviews created after this date (RFC3339 format, e.g. `2024-01-01T00:00:00Z`)
* **Created Before (Optional)**: Return reviews created before this date (RFC3339 format)
* **Updated After (Optional)**: Return reviews updated after this date (RFC3339 format)
* **Updated Before (Optional)**: Return reviews updated before this date (RFC3339 format)
* **Minimum Stars (Optional)**: Return only reviews with a star rating at or above this value (1–5)
* **Maximum Stars (Optional)**: Return only reviews with a star rating at or below this value (1–5)
* **Page Size (Optional)**: Number of results per page (max 100, default 10)
* **Page Number (Optional)**: Page number to retrieve (default 1)

## What the Step Returns

Each action returns a simplified response:

* **data**: the list of records found (products, reviews, or survey questions).
* **record\_count**: the total number of matching records.
* **links**: `next` and `prev` pagination links, when available.
* **message**: included only when `data` is empty, explaining the most likely cause (see "Why am I not getting any results?" below).

For **Get Survey Questions**, `data` contains G2's survey question definitions, and `record_count` reflects the total number of questions across G2's catalog, not a count scoped to a product.

## Common Use Cases

* Searching for competitor products by keyword and pulling their reviews for competitive analysis
* Filtering reviews by star rating to surface promoter or detractor feedback at scale
* Summarizing customer feedback with an AI step to surface key themes
* Monitoring sentiment trends over time using date-filtered review data
* Enriching content with real social proof and review quotes from G2

## Why am I not getting any results?

If an action runs successfully but returns no products or reviews, it almost always means the connected G2 account has nothing to return, not that the step is broken. The most common causes are:

* **Your G2 plan does not include Data API access.** This integration uses G2's paid Data API. A standard or free G2 login does not have this access.
* **No products are mapped to your account.** The API only returns products your account is licensed to access, which are mapped on G2's side (for example via the G2 Partner Dashboard). It does not search the full public g2.com catalog.
* **You are looking for a product you do not own.** Pulling other companies' products and reviews (for competitive research) requires broader catalog access in your G2 agreement.

In all of these cases, the fix is on the G2 side. Confirm with your G2 administrator or account representative what your Data API access includes and that the products you need are mapped to your account.

## Error Handling

By default, the G2 Integration step will terminate the workflow if it fails. You can configure it to continue by selecting "Continue" instead of "Terminate Workflow" in the step settings.


# Hunter.io

Retrieve email and company data

The Contact Enrichment Step offers multiple options for retrieving email and LinkedIn information. This can help build a robust hub for your user information and outbound sourcing.

## Supported Contact Enrichment Types

At this time, AirOps supports the following Contact Enrichment options.

{% hint style="info" %}
The endpoints for the email steps can all be found in greater detail [here](https://hunter.io/api-documentation/v2#domain-search).
{% endhint %}

### Hunter.io Email Verifier (Workflow Only)

This option allows you to verify the deliverability of an email address. When built into your workflows, this step is useful for only sending messages to intended recipients and avoiding any emails that bounce.

{% @arcade/embed url="<https://app.arcade.software/share/ju0qmF9GLB5TfQJE6Hhu>" flowId="ju0qmF9GLB5TfQJE6Hhu" %}

### Hunter.io Person Email Search (Workflow Only)

This option allows you to get the most likely email address from a domain name, first name, and last name.

In the example below, we walk through what the output looks like when the step finds a valid match as well as what the output looks like when it does not.

{% @arcade/embed url="<https://app.arcade.software/share/RP33lpCEljOeLhMJFYsM>" flowId="RP33lpCEljOeLhMJFYsM" %}

### Hunter.io Domain Email Search (Workflow Only)

This option provides a method to get publicly available email addresses associated with the domain.

{% @arcade/embed url="<https://app.arcade.software/share/UIsLk6CsReDxSTsmUcR7>" flowId="UIsLk6CsReDxSTsmUcR7" %}

### People Data Labs - Person Enrichment (Workflow Only)

The People Data Labs Person Enrichment provides LinkedIn Information, contact information, and much more. For a complete example of the data included, check out an [Example Person Record](https://docs.peopledatalabs.com/docs/example-record).

You must provide **one** of the following for this step:

* Social profile
* Email address
* Phone number
* Name and company

{% @arcade/embed url="<https://app.arcade.software/share/pTljAzbMkTA7Y5V7fZiT>" flowId="pTljAzbMkTA7Y5V7fZiT" %}

### People Data Labs - Company Enrichment (Workflow Only)

The People Data Labs Company Enrichment provides funding, employee count, and much more. For a complete example of the data included, check out an [Example Company Record](https://docs.peopledatalabs.com/docs/example-company-record).

You must provide **one** of the following for this step:

* Name
* Ticker
* Website
* Profile

{% @arcade/embed url="<https://app.arcade.software/share/Wq0sP0vDnDFRIR3bY8RK>" flowId="Wq0sP0vDnDFRIR3bY8RK" %}


# People Data Labs

People Data Labs steps provide access to comprehensive business intelligence data for companies and professionals. These powerful tools help you enrich your CRM, enhance lead generation, and create personalized outreach by retrieving detailed profiles for both companies and individuals.

### Available People Data Labs Steps

AirOps offers the following People Data Labs integration steps:

* [**People Data Labs - Company Enrichment** ](#people-data-labs-company-enrichment)-- access detailed company information including funding, size, and industry data
* [**People Data Labs - Person Enrichment** ](#people-data-labs-person-enrichment)-- gather comprehensive professional profiles including work history and contact details

### People Data Labs - Company Enrichment

This step allows you to access detailed company information including funding, size, and industry data. It provides comprehensive business intelligence that can enhance your lead qualification and targeting processes.

**Configuration**

You must provide **one** of the following identifiers to look up a company:

* **Name**: The company's name as it's commonly known (e.g., "AirOps", "Microsoft Corporation")
* **Ticker**: The company's stock market ticker symbol if it's publicly traded (e.g., "MSFT" for Microsoft)
* **Website**: The company's website domain or full URL (e.g., "airops.com" or "<https://www.airops.com>")
* **Profile**: A URL to the company's profile on a social platform like LinkedIn (e.g., "<https://www.linkedin.com/company/airops/>")

**Output Format**

```json
{
  "id": "1a2b3c4d5e",
  "name": "AirOps",
  "display_name": "AirOps",
  "size": "11-50",
  "employee_count": 25,
  "founded": 2021,
  "industry": "Computer Software",
  "naics": [
    {
      "name": "Software Publishers",
      "naics": "511210"
    }
  ],
  "location": {
    "name": "New York, New York, United States",
    "locality": "New York",
    "region": "New York",
    "country": "United States",
    "continent": "North America"
  },
  "website": "https://www.airops.com",
  "ticker": null,
  "type": "private",
  "summary": "AirOps is a platform for building and deploying AI-powered workflows for marketing and content creation.",
  "tags": [
    "artificial intelligence",
    "machine learning",
    "marketing automation"
  ],
  "metrics": {
    "annual_revenue": "1M-10M",
    "estimated_annual_revenue": 5000000,
    "raised": 15000000
  },
  "profiles": {
    "facebook": "https://www.facebook.com/airopsai",
    "linkedin": "https://www.linkedin.com/company/airops/"
  },
  "phone": "+1 (555) 123-4567",
  "emails": [
    "info@airops.com"
  ]
}
```

### People Data Labs - Person Enrichment

This step enables you to gather comprehensive professional profiles including work history and contact details. It provides LinkedIn information, contact information, and much more to power personalized outreach.

**Configuration**

You must provide **one** of the following identifiers to look up a person:

* **Social Profile**: A URL to the person's profile on a social platform like LinkedIn (e.g., "<https://www.linkedin.com/in/johndoe/>")
* **Email**: The person's email address (e.g., "<john.doe@company.com>")
* **Phone Number**: The person's phone number in international format (e.g., "+14155559876")
* **Name and Company**: If you don't have the above identifiers, you can search using:
  * **First Name**: The person's first/given name
  * **Last Name**: The person's last name/surname
  * **Company Name**: The name of the company where the person works

**Output Format**

```json
{
  "id": "pGj2y4NzB9aKpEWM3nGRdJ",
  "full_name": "John Smith",
  "first_name": "John",
  "last_name": "Smith",
  "middle_name": "Michael",
  "gender": "male",
  "birth_date": "1985-06-15",
  "location": {
    "name": "San Francisco, California, United States",
    "locality": "San Francisco",
    "region": "California",
    "country": "United States"
  },
  "work_email": "john.smith@company.com",
  "personal_emails": [
    "johnsmith85@gmail.com"
  ],
  "mobile_phone": "+14155551234",
  "work_phone": "+14155559876",
  "industry": "Computer Software",
  "job_title": "Senior Product Manager",
  "job_title_role": "product",
  "job_title_levels": [
    "senior"
  ],
  "job_company_name": "Acme Inc",
  "job_company_website": "acmeinc.com",
  "job_company_size": "201-500",
  "job_start_date": "2020-03-01",
  "skills": [
    "Product Management",
    "Product Strategy",
    "SaaS"
  ],
  "experience": [
    {
      "company": {
        "name": "Acme Inc",
        "size": "201-500",
        "industry": "Computer Software"
      },
      "title": "Senior Product Manager",
      "start_date": "2020-03-01",
      "end_date": null,
      "is_current": true
    },
    {
      "company": {
        "name": "Tech Solutions",
        "size": "51-200",
        "industry": "Computer Software"
      },
      "title": "Product Manager",
      "start_date": "2017-05-01",
      "end_date": "2020-02-28",
      "is_current": false
    }
  ],
  "education": [
    {
      "school": {
        "name": "Stanford University",
        "type": "college"
      },
      "degrees": [
        "MBA"
      ],
      "start_date": "2015-09-01",
      "end_date": "2017-06-01"
    }
  ],
  "profiles": {
    "linkedin": "https://www.linkedin.com/in/johnsmith",
    "facebook": "https://www.facebook.com/johnsmith",
    "twitter": "https://twitter.com/johnsmith"
  }
}
```

### Common Use Cases

#### Enhanced Lead Qualification

1. Import a list of target companies
2. Use **People Data Labs - Company Enrichment** to get detailed company information
3. Use a Code step to filter companies based on size, industry, or funding
4. For qualifying companies, use **People Data Labs - Person Enrichment** to find decision-makers
5. Create personalized outreach based on comprehensive data points

#### Personalized Sales Outreach

1. Start with a contact list of names and companies
2. Use **People Data Labs - Person Enrichment** to get detailed professional profiles
3. Use an LLM step to generate personalized outreach referencing:
   * Current role and responsibilities
   * Previous experience
   * Educational background
   * Skills relevant to your solution
4. Send targeted messages through your connected email platform

#### CRM Data Enrichment

1. Export contact data from your CRM
2. Use **People Data Labs - Company Enrichment** to enhance company records
3. Use **People Data Labs - Person Enrichment** to complete contact profiles
4. Use a Code step to merge and format the enriched data
5. Import the enhanced data back into your CRM

### Error Handling

By default, the People Data Labs steps will terminate the workflow if they fail. To continue the workflow if a step fails, click "Continue" at the bottom of the settings panel.

\[IMAGE: Screenshot showing the "Continue" option in the step settings]

The step will return the following keys when it fails:

* `output`: this will be `null`
* `error`:
  * `message`: the message returned from the step
  * `code`: the error code representing the error

Common error causes include:

* Insufficient information provided
* No matching record found
* Rate limits exceeded

### Example Workflow

Here's an example workflow that uses both People Data Labs steps for a comprehensive lead enrichment process:

1. Start with a list of target companies
2. Use **People Data Labs - Company Enrichment** to get detailed company information
3. Use a Code step to filter companies based on criteria (size, industry, funding, etc.)
4. For each qualifying company, use another Code step to construct a query for finding relevant decision-makers (e.g., "VP of Marketing", "Director of Content")
5. Use **People Data Labs - Person Enrichment** to find the right contacts within those companies
6. Use an LLM step to analyze the enriched profiles and generate personalized outreach messages
7. Send targeted messages through your connected email platform

This workflow enables highly targeted, data-driven outreach based on comprehensive company and contact information, significantly improving engagement rates compared to generic approaches.


# Workflow Outputs

Define how you want to render the output of a Workflow

## How do I define how the output will be rendered?

As part of configuring your workflow's End node, you can select how to render the text.

By default, the system will auto-detect the render type based on the content of the output.

<figure><img src="/files/weYaXo4SIdKm3JRz70gX" alt=""><figcaption></figcaption></figure>

## Supported Render Types

The following render types are currently supported:

1. **Markdown:** Supports text formatting, links, and images for rich text presentation.
2. **Code:** Displays code with proper formatting and syntax highlighting.
3. **HTML:** Renders HTML content as a web page viewer.

## Single vs Multi-Output

You can easily toggle between single output and multi-output modes directly in the End step configuration. No JSON step required.

* **Single Output:** Returns one value from your workflow. Ideal for simple workflows that produce a single piece of content.
* **Multi-Output:** Returns multiple named values from your workflow. Use this when you need to output several distinct pieces of data (e.g., title, body, meta description).

To switch between modes, click the toggle in the End step configuration panel. When using multi-output, you can define multiple output fields, each with its own name and render type.


# Variable Referencing

<figure><img src="/files/duZCfCfSmOdZW9oA1fAz" alt="" width="375"><figcaption></figcaption></figure>

Variables are a key component of AirOps Workflows, allowing you to create dynamic, personalized, and contextual content. Learn how to reference variables in your Workflows, whether they come from inputs or from step outputs.

### Types of Variables

In AirOps Workflows, you can reference two primary types of variables:

1. **Input Variables**: Values defined in the Start step of your Workflow, including:
   * Custom inputs (text, numbers, JSON, files, etc.)
   * Brand Kit attributes
2. **Step Output Variables**: Results generated by previous steps in your Workflow

### Referencing Input Variables

Input variables are referenced using the Variable Selector (the pink icon on the top right of an input field) or using Liquid syntax with double curly braces: `{{ variable_name }}`

{% @arcade/embed url="<https://app.arcade.software/share/UOOVKYOIhh8WSNVTEosj>" flowId="UOOVKYOIhh8WSNVTEosj" %}

#### Example: Custom Input Variables

When you define an input in your Workflow's Start step (like "topic" or "keyword"), you can reference it in subsequent steps:

```
{{ topic }}
{{ keyword }}
```

#### Example: Brand Kit Variables

If you've connected a Brand Kit to your Workflow, you can reference its attributes:

**Foundation attributes:**

```
{{ brand_kit.brand_name }}
{{ brand_kit.brand_domain }}
{{ brand_kit.brand_about }}
{{ brand_kit.writing_tone }}
{{ brand_kit.writing_persona }}
{{ brand_kit.writing_rules }}
```

**Product Lines, Content Types, Audiences, and Regions:**

When using Brand Kit columns in Grids, you can access the selected dimensions:

```
{{ brand_kit.product_lines }}
{{ brand_kit.content_type }}
{{ brand_kit.content_type.outline }}
{{ brand_kit.content_type.writing_rules }}
{{ brand_kit.audience }}
{{ brand_kit.audience.description }}
{{ brand_kit.audience.writing_rules }}
{{ brand_kit.region }}
{{ brand_kit.region.description }}
{{ brand_kit.region.writing_rules }}
```

### Referencing Step Output Variables

Every step in your Workflow generates an output that can be referenced in subsequent steps. These are referenced using the step number and the `output` property:

```
{{ step_1.output }}
```

For steps that return structured data (like JSON), you can access specific properties:

```
{{ step_2.output.title }}
{{ step_3.output.keywords[0] }}
```

{% @arcade/embed url="<https://app.arcade.software/share/AgTu3iMw31nkpBdngDwu>" flowId="AgTu3iMw31nkpBdngDwu" %}

### Best Practices

* Use the Variable Selector (purple pill button) to easily add variable references without typing the syntax
* Preview outputs in the Test panel to understand their structure before referencing
* For JSON outputs, check the structure in the Test panel to correctly reference nested properties
* Remember that variables can only reference previous steps, not future ones

### Common Use Cases

* Pass user input into an LLM prompt: `Write an article about {{ topic }}`
* Include brand voice in prompts: `{{ brand_kit.writing_persona }}`
* Process the output of an LLM in a subsequent step: `{{ step_1.output }}`
* Extract specific data from API responses: `{{ step_3.output.results[0].url }}`
* Format text with previous step results: `The generated headline is: {{ step_2.output.headline }}`

By effectively leveraging variables in your Workflows, you can create powerful, dynamic applications that respond to inputs and build upon the results of each step.


# Liquid Templating

An introduction to our powerful templating language

## What is Liquid?

[Liquid](https://shopify.github.io/liquid/basics/introduction/) is a templating language created by Shopify and used extensively by others to create dynamic content. It's useful for referencing variables, modifying text (for example truncating) and for creating basic logic (if statements, for loops etc).

Liquid can be used in most areas throughout our product, including:

* Input Fields in Workflows
* LLM Prompts
* Text Steps
* Knowledge Base Search Steps
* JSON Steps

{% hint style="info" %}
Code Steps do NOT use Liquid Syntax
{% endhint %}

## How to Reference Inputs with Liquid

This section will walk through how to reference your pre-defined input variables.

1. Ensure that you have [configured an Input step](/actions/workflow-concepts/application-inputs)
2. If you did not enter a separate variable name, use the default variable name to reference the input value
3. Click the purple Variable Selector to see a list of your available inputs and select the desired input

In the example below, we walk through using our input variable value, and referencing it in our LLM Step using Liquid syntax.

{% @arcade/embed url="<https://app.arcade.software/share/OMkzzu6SdRcxNWMEWIBm>" flowId="OMkzzu6SdRcxNWMEWIBm" %}

## How to Reference Outputs with Liquid

Just like with inputs, you can reference the outputs of any prior step of your Workflow in any subsequent step.

Currently, step names are automatically defined incrementally, e.g. `step_1` ,`step_2` , `step_3` , etc.

To reference the output of a step, simply click the `step_number` pill or manually type it in in the format `{{step_12.output}}` . If that step outputs JSON, then you can reference any of the sub-keys.

In the example below, we walk through how you can view the full list of available variables and use the proper syntax to call them within your Workflow.

{% @arcade/embed url="<https://app.arcade.software/share/OMkzzu6SdRcxNWMEWIBm>" flowId="OMkzzu6SdRcxNWMEWIBm" %}

### Consolidating Step Outputs using Liquid

One of the more useful applications for Liquid syntax is combining it with our Text Step to perform additional formatting and ensure your output looks exactly the way you desire.

The screenshot below showcases how we reference the output of previous steps (even pulling specific array elements as variables) to format our "step\_2" into a more readable and organized output.

<figure><img src="/files/Dk0YdSAldy2Quwba1jg5" alt="" width="563"><figcaption></figcaption></figure>

### Advanced Liquid Templating Use Cases

Liquid templating provides powerful capabilities for handling complex data structures in your Workflows. Below are advanced techniques for working with iterators, arrays, and structured data.

#### Looping Through Iterator Outputs

When working with the Iteration Step, you can use Liquid's `for` loops to process the output array elements. This pattern is commonly used to consolidate information from multiple iterations into a single output:

```
{% for chunk in step_12.output %}
  {{ chunk }}
{% endfor %}
```

#### Processing Search Results

**Basic Content Extraction**

Extract and format content from search results or Knowledge Base searches:

```
{% for result in step_3.output %}
  {{ result.content }}
{% endfor %}
```

**Metadata Handling**

Access and format metadata from Knowledge Base search results:

```
{% for result in step_4.output %}
  Title: {{ result.metadata.title }}
  Description: {{ result.metadata.description }}
{% endfor %}
```

By mastering these advanced Liquid templating techniques, you can transform complex data structures into well-formatted outputs that serve as perfect inputs for subsequent steps in your Workflow.

### More Information

For additional information regarding Liquid, we recommend reviewing [Shopify's Documentation](https://shopify.github.io/liquid/).


# Power Agents

### What are Power Agents?

Power Agents are pre-built, reusable workflow components designed to accelerate your content operations in AirOps. Think of them as expertly crafted building blocks that encapsulate best practices for common marketing and SEO tasks. Each Power Agent is a tested, optimized mini-workflow that performs a specific function, from keyword research to content creation to optimization tasks.

Rather than building workflows from scratch, Power Agents allow you to leverage proven processes that our team and community have refined through hundreds of iterations.

### Where to Find Power Agents

You can access Power Agents in two ways:

#### 1. Within the Workflow Studio

When building a workflow, click the **"Power Agents"** tab at the top of the step selector panel. Power Agents are organized into categories:

* **Content Research** - Analyze SERPs, cluster keywords, identify opportunities
* **Content Planning** - Create briefs, research products, plan content strategy
* **Content Creation** - Generate articles, add links, create meta tags
* **Content Refresh** - Research competitive gaps, improve existing content

<figure><img src="/files/E5zCoSOSeqyZUf9ugv5M" alt=""><figcaption></figcaption></figure>

#### 2. Directly in the Grid

Power Agents can be added directly to your Grid for bulk running:

1. Click **"+ Add Column"** in your Grid
2. Select a Power Agents from the dropdown menu
3. Map the Power Agents inputs to your existing Grid columns
4. Run the Power Agents across multiple rows simultaneously

This enables you to process hundreds of rows at once, with results appearing directly in your Grid for immediate use.

<figure><img src="/files/OPcfMceZNigghopTzEpH" alt=""><figcaption></figcaption></figure>

### Viewing Power Agents Details

To understand what a Power Agent does before using it:

1. Click on any Power Agent in the selector
2. Select **"Learn More"** to view:
   * **Expected Inputs** - What data the Power Agent requires
   * **Expected Outputs** - What the Power Agent will generate
   * **Details** - Including last update, task cost, and estimated runtime
   * **Category** - The functional area it belongs to

This detailed view helps you understand exactly how the Power Agent will transform your data and what resources it will consume.

<figure><img src="/files/TlVS9B4czIQF0Vx9Ltso" alt=""><figcaption></figcaption></figure>

### Scheduling Power Agents

Schedule Power Agent columns to run automatically:

1. Click the Power Agent column header
2. Select **"Schedule Workflow"**
3. Configure:
   * **Frequency**: Daily, Weekly, or Monthly
   * **Time & Days**: When to run
   * **Row Filters**: Target specific rows (e.g., "output is empty")
   * **Row Limits**: Control batch size

### Forking Power Agents

**Note:** This feature is currently available as an add-on on Enterprise tier plans.

Forking allows you to create a customized version of any Power Agent. This is useful when you want to:

* Modify the underlying prompts to match your brand voice
* Adjust the logic for your specific use case
* Add or remove steps from the workflow
* Create variations for different content types

### Best Practices

* **Start with Power** Agents - Before building custom workflows, check if a Power Agent already exists for your use case
* **Chain Power** Agents - Many Power Agents are designed to work together (e.g., "Create Content Brief from Keyword" → "Create Article from Content Brief")
* **Review outputs** - Power Agents include quality control mechanisms, but always review outputs before publishing
* **Monitor costs** - Check the task cost in the details view to understand resource usage before running at scale

Power Agents are continuously updated based on user feedback and performance data, ensuring you always have access to the most effective workflows for your content operations.


# Copilot

## AirOps Copilot

Copilot is an AI-powered assistant that helps you build and improve your workflows. When you ask for help with your workflow, Copilot analyzes your requirements and provides targeted suggestions that you can choose to implement.

<figure><img src="/files/1dJ1YgqKXbWaTvztXw7B" alt=""><figcaption></figcaption></figure>

Copilot provides a wide range of assistance to improve your workflow building experience. These are just some examples:

* **Explanation assistance:** Ask Copilot to explain how your workflow functions, helping you understand the flow of data and steps in your automation.
* **Build guidance:** Get step-by-step instructions on how to construct workflows for specific use cases, with Copilot suggesting appropriate steps and connections.
* **Optimization recommendations:** Receive suggestions for improving your workflows, including adding error handling, refining prompts, or implementing more efficient logic.
* **Debugging support:** When your workflow encounters errors, ask Copilot to analyze the issue and provide troubleshooting steps to resolve the problem.

{% @arcade/embed url="<https://app.arcade.software/share/nRDXOumHXnlovCTtVc1j>" flowId="nRDXOumHXnlovCTtVc1j" %}


# Edit Workflows with Copilot

Copilot can help you edit and refine your existing workflows. When you make a request, it analyzes your current workflow structure and provides suggestions for modifications, whether it's adding new steps, improving existing ones, or fixing errors.

## Applying Changes with Copilot

* When you need to modify your existing workflow steps, Copilot can recommend changes to step configurations, prompts, or parameters.
* Simply click the "Apply changes" button when Copilot suggests modifications to an existing step.
* This streamlined approach allows you to quickly implement improvements to your workflow components without having to rebuild them from scratch.

<figure><img src="/files/rEnzEQ8QHOtodu9qMIE1" alt="" width="563"><figcaption></figcaption></figure>

## Adding Steps with Copilot

* For requests requiring new steps, Copilot can recommend adding entirely new steps to your workflow.
* By clicking the "Add Step" button when Copilot makes these suggestions, you can seamlessly incorporate new capabilities into your workflow.
* The new steps integrate smoothly with your existing workflow, ensuring existing variables and steps are referenced correctly.

<figure><img src="/files/zMLCA46xx3BFRohOGl6V" alt="" width="563"><figcaption></figcaption></figure>

## Copilot Auto-Mode

* Auto Mode lets Copilot automatically apply changes, test outputs, and make further improvements without requiring you to manually accept each suggestion.
* Copilot analyzes each step's output and continues refining until your original request is fully addressed.
* Auto Mode currently works with LLM and Code Steps, with support for additional step types expanding soon.

<figure><img src="/files/cMSUyPdIC26X2TnTizD6" alt=""><figcaption></figcaption></figure>

**How to Activate Auto-Mode:** Click the sparkle icon next to the input field when asking Copilot to make workflow improvements to enable Auto Mode.




---

[Next Page](/llms-full.txt/1)

