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

# Workflow Blocks

> Reference for all workflow block types supported by the Workflows API.

## Use case

Discover which block types you can use when building workflows. Use `GET /workflows/blocks` to retrieve the full list and specs schemas programmatically. This page provides a quick reference for common use cases.

<Card title="API Reference" icon="code" href="/api-reference/workflow/list-available-blocks">
  See the full request/response schema and parameters in the API Reference.
</Card>

## Pricing

See [Credits & Pricing Guide](/guides/credits-and-pricing) for credit costs.

## Errors

For error responses (400, 403, 404, etc.), see [Handling Errors](/api-reference/errors).

## Get available blocks

Retrieve the list of all workflow block types supported by the API, along with their specs schemas.

```http theme={null}
GET https://api.sixtyfour.ai/workflows/blocks
```

Returns an array of block descriptors. Each entry includes the block's name (used as `block_name` when building a workflow) and a `specs_schema` object describing its configurable fields.

## Available blocks

<Note>The UI name is the name of the block as it appears in the Workflow Builder.</Note>

| Block Name | UI Name | Use Case |
| - | - | - |
| `append_to_notebook` | Notebook | Append or upsert workflow rows into a notebook (supports duplicate detection and column mapping) |
| `backlinks_referring_domains` | Backlinks | Get referring domains for a target domain or URL, with pagination |
| `breached_db_search` | Breached Database Search | Look up whether email addresses appear in known data breaches |
| `company_enrichment` | Enrich Company | Enrich company records; optionally find people, define lead struct, or use a research plan |
| `company_to_leads` | Extract Leads | Expand company rows into individual lead records (select company/lead fields) |
| `deduplicate` | Deduplicate | Remove duplicate rows from input based on specified column(s); choose first, last, or remove all |
| `deduplicate_wrt_notebook` | Deduplicate with Notebook | Deduplicate against a notebook tab (single or multi-column matching); optionally keep only rows that exist in notebook |
| `filter` | Filter | Filter rows by pandas query string or field-based conditions (include, exclude, contains, not\_contains) |
| `find_email` | Email address | Find professional or personal email addresses for leads; optionally verify emails. Can skip rows that already have the email. See [Find Email](#find-email). |
| `find_phone` | Phone | Find phone numbers for leads |
| `find_subdomains` | Find Subdomains | Find subdomains for a domain (with optional time filters) |
| `github_find_people` | GitHub Find People | Find people from GitHub repos: contributors, stargazers, or watchers; requires integration and repository column |
| `github_search` | GitHub Search | Search GitHub for repositories, users, or code; requires integration, search type, and query |
| `google_maps_search` | Google Maps | Search Google Maps for places by query, location, Place ID, or CID; returns phone numbers and business details; supports pagination |
| `group_by` | Group By | Group rows by column(s) and aggregate others (first, last, count, sum, list, concat, min, max); optionally nest data |
| `hubspot_import` | HubSpot Import | Import contacts or companies from HubSpot; requires integration and object type |
| `kaggle_leaderboard` | Kaggle | Get leaderboard participants from Kaggle competitions; requires competition column |
| `lead_enrichment` | Enrich People | Enrich lead records with return fields and optional research plan |
| `leads_to_company` | Leads to Company | Group leads into company rows with nested leads list; inverse of `company_to_leads` |
| `monitor` | Monitor | Start a monitor over the rows that reach this block, which then keeps their watched fields current on its own schedule. Terminal block; requires Monitors to be enabled. See [Monitor](#monitor). |
| `llm_openai` | Generate Text | Generate text via prompt template over input rows; use `{column_name}` for column substitution |
| `outgoing_webhook` | Outgoing Webhooks | POST workflow results to an external URL on completion. See [Outgoing Webhooks](/api-reference/webhooks/outgoing); signed with HMAC-SHA256 if the org has a signing secret — see [Signing Secrets & Verification](/api-reference/webhooks/signing-secrets). |
| `qa_agent` | N/A | Run an agent that answers questions using tools; configurable max tool calls |
| `read_notebook` | Read Notebook | Read data from a notebook tab; requires `notebook_id`, `tab_id`, and `dataframe` type (LEAD or COMPANY) |
| `remove_columns` | Remove Columns | Remove specified columns from the data |
| `research_agent` | Web Research Agent | Run research with optional struct and research plan |
| `reverse_email` | Reverse Email | Look up person or company info from an email address |
| `reverse_phone` | Reverse Phone | Look up person or company info from a phone number |
| `scrape_web` | Scrape Website | Scrape web content from URLs in a column; output as markdown or HTML; supports geo, JS rendering, proxies |
| `search` | Search | Load search results persisted to storage as CSV, or accept direct results; requires dataframe type |
| `send_slack_message` | Slack | Send Slack messages to channels or DMs; use `{column}` for substitution, `{@column}` to tag by email |
| `tiktok_get_following` | TikTok | Get TikTok following list from profile URLs or handles in a column |
| `transform_data` | LLM Output | Generate structured or unstructured text using configurable LLM models |
| `verify_email` | Verify Email | Verify email deliverability (default column: email) |
| `verify_phone` | Verify Phone | Verify phone numbers and match them to the lead; requires `phone_column` and `name_column`. See [Verify Phone](#verify-phone). |
| `webhook` | Incoming Webhooks | Accept external input via webhook; requires input\_schema and `dataframe_type` (workflow entry point). See [Incoming Webhooks](/api-reference/webhooks/incoming). |
| `x_search` | X | Search X/Twitter for profiles by query (e.g., "AI researchers", "crypto founders in NYC") |
| `yc_batches` | N/A | Fetch Y Combinator batch metadata |
| `yc_companies` | Y Combinator | Search or filter Y Combinator companies by batch, industry, tags, or status |

### Find Email

`find_email` finds a work email (`mode: "PROFESSIONAL"`) or a personal email (`mode: "PERSONAL"`) for each row.

**Inputs**

| Field | Default | Description |
| - | - | - |
| `mode` | — | Required. `PROFESSIONAL` finds a work email; `PERSONAL` finds a personal email. |
| `skip_rows_with_existing_input` | `false` | When `true`, rows that already have the email skip the lookup, are not charged, and are returned unchanged with status `PROVIDED`. |

**Skipping rows that already have the email**

With `skip_rows_with_existing_input: true`, put the email you already have in one of these columns:

| Mode | Column | Skipped when |
| - | - | - |
| `PROFESSIONAL` | `work_email`, `email` or `email_address` | The value is an email on a company domain. A personal address such as gmail.com does not count, so the row is still looked up. |
| `PERSONAL` | `personal_email` | The value is an email. |

Blank, `N/A` and malformed values count as missing, so the row is looked up. Skipped rows keep their position and input values, cost no credits, and get `email_status` (or `personal_email_status` in `PERSONAL` mode) set to `PROVIDED`. In `PROFESSIONAL` mode the matched work email is also written to `email` when that column is blank or holds a personal address. The run's cost estimate still counts every row, since which rows skip is only known once the run reads them.

**Output columns**

| Mode | Columns |
| - | - |
| `PROFESSIONAL` | `email`, `email_status`, `email_type`, `other_emails` |
| `PERSONAL` | `personal_email`, `personal_email_status`, `personal_email_type`, `personal_other_emails` |

### Verify Phone

`verify_phone` verifies each row's phone number against the person's full name using the configured input column names.

All twelve output columns are included. Missing output fields start as null; skipped rows retain any existing verification values. See [Handling Errors](/api-reference/errors#verify-phone-column-mappings) for missing-input behavior.

**Inputs**

| Field | Default | Description |
| - | - | - |
| `phone_column` | `phone` | Column containing the phone number. Required. |
| `name_column` | `name` | Column containing the person's full name, required for verification. Must match the actual input column, such as `fullName` or `full_name`. |
| `email_column` | — | Optional column containing an email address. Populates the `email_*` output columns. |
| `ip_address_column` | — | Optional column containing an IP address, used as an additional verification signal. |
| `address_street_line_1_column`, `address_city_column`, `address_state_code_column`, `address_postal_code_column`, `address_country_code_column` | — | Optional columns containing postal address parts. Populate the `address_*` output columns. |
| `country_hint` | — | Optional ISO 3166-1 alpha-2 region code used to parse numbers written in national format. |

**Output columns**

| Column | Description |
| - | - |
| `phone_is_valid` | Whether the number is valid. |
| `phone_activity_score` | Activity score for the number. |
| `phone_line_type` | Line type of the number. |
| `phone_name_match` | Whether the name matches the number's owner. |
| `phone_contact_grade` | Contact grade for the phone. |
| `email_is_valid` | Whether the email is valid. |
| `email_name_match` | Whether the name matches the email's owner. |
| `email_contact_grade` | Contact grade for the email. |
| `address_is_valid` | Whether the address is valid. |
| `address_name_match` | Whether the name matches the address. |
| `phone_warnings` | Warnings for the row, such as `Missing Name`. |
| `phone_errors` | Error details when the row could not be verified. |

### Monitor

`monitor` starts one [monitor](/api-reference/monitors/monitors-overview) over the rows that reach it. It runs once all rows have arrived and returns no rows, so place it last in the workflow. Each workflow run starts its own monitor, which keeps checking on its own schedule after the run ends.

**Specs**

| Field | Default | Description |
| - | - | - |
| `key_columns` | — | Columns that identify each row. Required. Rows with no value in any of them are skipped. Rows with the same values are watched once. |
| `watched` | — | Watched fields: field name → description, or an object with `type`, `description`, and `subfields`. Required. A column with the same name as a watched field sets that field's starting value. |
| `frequency` | `1d` | How often the monitor checks, `1h` to `30d`. Independent of how often the workflow runs. |
| `first_check` | `now` | `now` runs setup immediately only for rows missing watched values; complete rows wait for the schedule. `next_tick` defers every row to the first scheduled fire. |
| `tier` | `low` | Depth of the full re-check: `low`, `medium`, or `high`. |
| `subject_type` | `company` | `company` or `lead`. |
| `research_plan` | — | Instructions for the enrichment that re-derives the fields. |
| `name` | watched field names | Name of the monitor the run starts. |

A row whose input columns already supply every watched field skips the full first check: it starts from those values and waits for the schedule, where checks begin with the lightweight probe. In a mixed table, immediate setup runs only for incomplete rows.

Monitors started by this block have no webhook. Retrieve the monitor a run started with `GET /monitors/for-run/{workflow_run_id}/{block_id}`. See [Monitor Endpoints](/api-reference/monitors/monitors-endpoints#get-the-monitor-a-workflow-run-started).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.