feat(integrations): add RB2B integration (#4784)

* make zoominfo icon a bit bigger

* feat(integrations): add RB2B integration

Add the RB2B AI workspace integration for person-level visitor identification and B2B enrichment via the RB2B API (api.rb2b.com).

- 15 tools: credit check, IP to HEM/MAID/company, email/HEM to business profile/best LinkedIn/LinkedIn slug/MAID, email to last active date, and LinkedIn to business profile/best personal email/personal email/hashed emails/mobile phone, plus LinkedIn slug search
- Single API-key block with an operation dropdown, conditional inputs, and outputs covering every tool
- RB2B icon and generated docs

* fix(integrations): address RB2B PR review

- email_to_activity now has its own plaintext Email field (canonicalParamId) instead of sharing the Email-or-MD5 input, since it does not accept MD5 hashes
- RB2BIcon uses useId() for its clipPath id instead of a hardcoded id, matching the convention used by other icons

* fix(integrations): map RB2B email_to_activity input via params, not canonicalParamId

The canonical-pair validation test requires canonical members to share the same
condition. Replace the cross-operation canonicalParamId reuse with two distinct
subblock ids (email for HEM ops, emailAddress for email_to_activity) and a small
tools.config.params remap to the email tool param.
This commit is contained in:
Waleed
2026-05-28 18:04:55 -07:00
committed by GitHub
parent 2490a3c37c
commit f2c17d8072
28 changed files with 2433 additions and 1 deletions
+42
View File
@@ -1574,6 +1574,48 @@ export function ExaAIIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function RB2BIcon(props: SVGProps<SVGSVGElement>) {
const id = useId()
const clipId = `rb2b_clip_${id}`
return (
<svg viewBox='0 0 165 48' fill='none' xmlns='http://www.w3.org/2000/svg' {...props}>
<g clipPath={`url(#${clipId})`}>
<path d='M95.975 8.40234H87.5703V16.8057H95.975V8.40234Z' fill='#0C1316' />
<path d='M121.405 8.40234H113V16.8057H121.405V8.40234Z' fill='#0C1316' />
<path d='M112.998 16.8066H104.594V25.21H112.998V16.8066Z' fill='#0C1316' />
<path d='M104.596 25.2109H96.1914V33.6143H104.596V25.2109Z' fill='#0C1316' />
<path
d='M87.7852 39.5965V42.0166V47.9998H121.404V39.5965H96.1898V33.6133H87.7852V39.5965Z'
fill='#0C1316'
/>
<path d='M112.786 0H95.9766V8.40336H112.786V0Z' fill='#0C1316' />
<path
d='M52.3773 8.40336H74.3639V0H52.3773H43.9727V48H52.3773H74.3639V39.5966H52.3773V28.2017H74.3639V19.7983H52.3773V8.40336Z'
fill='#0C1316'
/>
<path d='M82.7718 8.40234H74.3672V19.7973H82.7718V8.40234Z' fill='#0C1316' />
<path d='M82.7679 28.2031H74.3633V39.5981H82.7679V28.2031Z' fill='#0C1316' />
<path d='M164.998 8.40234H156.594V19.7973H164.998V8.40234Z' fill='#0C1316' />
<path d='M164.998 28.2031H156.594V39.5981H164.998V28.2031Z' fill='#0C1316' />
<path
d='M134.608 19.7983V8.40336H156.594V0H134.608H126.203V48H134.608H156.594V39.5966H134.608V28.2017H156.594V19.7983H134.608Z'
fill='#0C1316'
/>
<path
d='M8.40464 8.40336H30.3912V0H8.40464H0V48H8.40464V28.2017H21.9866V36.605H30.3912V48H38.7958V28.2017H30.3912V19.7983H8.40464V8.40336Z'
fill='#0C1316'
/>
<path d='M38.7953 8.40234H30.3906V19.7973H38.7953V8.40234Z' fill='#0C1316' />
</g>
<defs>
<clipPath id={clipId}>
<rect width='165' height='48' fill='white' />
</clipPath>
</defs>
</svg>
)
}
export function RedditIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
+2
View File
@@ -152,6 +152,7 @@ import {
QdrantIcon,
QuiverIcon,
RailwayIcon,
RB2BIcon,
RDSIcon,
RedditIcon,
RedisIcon,
@@ -382,6 +383,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
qdrant: QdrantIcon,
quiver: QuiverIcon,
railway: RailwayIcon,
rb2b: RB2BIcon,
rds: RDSIcon,
reddit: RedditIcon,
redis: RedisIcon,
@@ -148,6 +148,7 @@
"qdrant",
"quiver",
"railway",
"rb2b",
"rds",
"reddit",
"redis",
+756
View File
@@ -0,0 +1,756 @@
---
title: RB2B
description: Identify and enrich website visitors
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="rb2b"
color="#51FF00"
/>
## Usage Instructions
Resolve IP addresses, hashed emails, and LinkedIn profiles into person-level identity and B2B enrichment data using the RB2B API. Convert IPs to hashed emails, MAIDs, and company domains; enrich emails into LinkedIn profiles, business profiles, and mobile IDs; and look up emails or phone numbers from LinkedIn. Requires an RB2B API key.
## Tools
### `rb2b_credit_check`
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `credits_remaining` | number | API credits remaining \(Credit Check\) |
| `results` | json | Result list for IP/MAID/company/activity lookups |
| `match_count` | number | Number of matches \(Email to Last Active Date\) |
| `credits_charged` | number | Credits charged for the request |
| `credits_exhausted` | boolean | Whether the account is out of credits |
| `linkedin_url` | string | LinkedIn profile URL |
| `linkedin_slug` | string | LinkedIn slug |
| `email` | string | Best personal email |
| `emails` | array | Personal email addresses |
| `mobile_phone` | string | Mobile phone number |
| `business_md5_array` | array | MD5 hashes of business emails |
| `business_sha256_array` | array | SHA-256 hashes of business emails |
| `personal_md5_array` | array | MD5 hashes of personal emails |
| `personal_sha256_array` | array | SHA-256 hashes of personal emails |
| `first_name` | string | First name \(business profile\) |
| `last_name` | string | Last name \(business profile\) |
| `full_name` | string | Full name \(LinkedIn business profile\) |
| `headline` | string | LinkedIn headline |
| `title` | string | Job title |
| `seniority` | string | Seniority level |
| `country` | string | Country |
| `current_industry` | string | Current industry |
| `functional_area` | json | Functional area\(s\) |
| `current_company` | string | Current company name |
| `current_company_url` | string | Current company website |
| `current_company_linkedinurl` | string | Current company LinkedIn URL |
| `company` | json | Company details \(LinkedIn business profile\) |
| `business_email` | string | Business email address |
| `personal_email` | string | Personal email address |
| `personal_emails` | array | Personal emails \(business profile\) |
| `linkedinurl` | string | LinkedIn profile URL \(business profile\) |
| `link_email` | string | Linked business email \(business profile\) |
| `work_email_confirmed` | string | Whether the work email is confirmed |
| `company_employee_count` | string | Company employee count |
| `company_employee_range` | string | Company employee range band |
| `company_revenue_range` | string | Company revenue range band |
| `md5` | string | MD5 hash of the resolved email |
### `rb2b_ip_to_hem`
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `credits_remaining` | number | API credits remaining \(Credit Check\) |
| `results` | json | Result list for IP/MAID/company/activity lookups |
| `match_count` | number | Number of matches \(Email to Last Active Date\) |
| `credits_charged` | number | Credits charged for the request |
| `credits_exhausted` | boolean | Whether the account is out of credits |
| `linkedin_url` | string | LinkedIn profile URL |
| `linkedin_slug` | string | LinkedIn slug |
| `email` | string | Best personal email |
| `emails` | array | Personal email addresses |
| `mobile_phone` | string | Mobile phone number |
| `business_md5_array` | array | MD5 hashes of business emails |
| `business_sha256_array` | array | SHA-256 hashes of business emails |
| `personal_md5_array` | array | MD5 hashes of personal emails |
| `personal_sha256_array` | array | SHA-256 hashes of personal emails |
| `first_name` | string | First name \(business profile\) |
| `last_name` | string | Last name \(business profile\) |
| `full_name` | string | Full name \(LinkedIn business profile\) |
| `headline` | string | LinkedIn headline |
| `title` | string | Job title |
| `seniority` | string | Seniority level |
| `country` | string | Country |
| `current_industry` | string | Current industry |
| `functional_area` | json | Functional area\(s\) |
| `current_company` | string | Current company name |
| `current_company_url` | string | Current company website |
| `current_company_linkedinurl` | string | Current company LinkedIn URL |
| `company` | json | Company details \(LinkedIn business profile\) |
| `business_email` | string | Business email address |
| `personal_email` | string | Personal email address |
| `personal_emails` | array | Personal emails \(business profile\) |
| `linkedinurl` | string | LinkedIn profile URL \(business profile\) |
| `link_email` | string | Linked business email \(business profile\) |
| `work_email_confirmed` | string | Whether the work email is confirmed |
| `company_employee_count` | string | Company employee count |
| `company_employee_range` | string | Company employee range band |
| `company_revenue_range` | string | Company revenue range band |
| `md5` | string | MD5 hash of the resolved email |
### `rb2b_ip_to_maid`
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `credits_remaining` | number | API credits remaining \(Credit Check\) |
| `results` | json | Result list for IP/MAID/company/activity lookups |
| `match_count` | number | Number of matches \(Email to Last Active Date\) |
| `credits_charged` | number | Credits charged for the request |
| `credits_exhausted` | boolean | Whether the account is out of credits |
| `linkedin_url` | string | LinkedIn profile URL |
| `linkedin_slug` | string | LinkedIn slug |
| `email` | string | Best personal email |
| `emails` | array | Personal email addresses |
| `mobile_phone` | string | Mobile phone number |
| `business_md5_array` | array | MD5 hashes of business emails |
| `business_sha256_array` | array | SHA-256 hashes of business emails |
| `personal_md5_array` | array | MD5 hashes of personal emails |
| `personal_sha256_array` | array | SHA-256 hashes of personal emails |
| `first_name` | string | First name \(business profile\) |
| `last_name` | string | Last name \(business profile\) |
| `full_name` | string | Full name \(LinkedIn business profile\) |
| `headline` | string | LinkedIn headline |
| `title` | string | Job title |
| `seniority` | string | Seniority level |
| `country` | string | Country |
| `current_industry` | string | Current industry |
| `functional_area` | json | Functional area\(s\) |
| `current_company` | string | Current company name |
| `current_company_url` | string | Current company website |
| `current_company_linkedinurl` | string | Current company LinkedIn URL |
| `company` | json | Company details \(LinkedIn business profile\) |
| `business_email` | string | Business email address |
| `personal_email` | string | Personal email address |
| `personal_emails` | array | Personal emails \(business profile\) |
| `linkedinurl` | string | LinkedIn profile URL \(business profile\) |
| `link_email` | string | Linked business email \(business profile\) |
| `work_email_confirmed` | string | Whether the work email is confirmed |
| `company_employee_count` | string | Company employee count |
| `company_employee_range` | string | Company employee range band |
| `company_revenue_range` | string | Company revenue range band |
| `md5` | string | MD5 hash of the resolved email |
### `rb2b_ip_to_company`
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `credits_remaining` | number | API credits remaining \(Credit Check\) |
| `results` | json | Result list for IP/MAID/company/activity lookups |
| `match_count` | number | Number of matches \(Email to Last Active Date\) |
| `credits_charged` | number | Credits charged for the request |
| `credits_exhausted` | boolean | Whether the account is out of credits |
| `linkedin_url` | string | LinkedIn profile URL |
| `linkedin_slug` | string | LinkedIn slug |
| `email` | string | Best personal email |
| `emails` | array | Personal email addresses |
| `mobile_phone` | string | Mobile phone number |
| `business_md5_array` | array | MD5 hashes of business emails |
| `business_sha256_array` | array | SHA-256 hashes of business emails |
| `personal_md5_array` | array | MD5 hashes of personal emails |
| `personal_sha256_array` | array | SHA-256 hashes of personal emails |
| `first_name` | string | First name \(business profile\) |
| `last_name` | string | Last name \(business profile\) |
| `full_name` | string | Full name \(LinkedIn business profile\) |
| `headline` | string | LinkedIn headline |
| `title` | string | Job title |
| `seniority` | string | Seniority level |
| `country` | string | Country |
| `current_industry` | string | Current industry |
| `functional_area` | json | Functional area\(s\) |
| `current_company` | string | Current company name |
| `current_company_url` | string | Current company website |
| `current_company_linkedinurl` | string | Current company LinkedIn URL |
| `company` | json | Company details \(LinkedIn business profile\) |
| `business_email` | string | Business email address |
| `personal_email` | string | Personal email address |
| `personal_emails` | array | Personal emails \(business profile\) |
| `linkedinurl` | string | LinkedIn profile URL \(business profile\) |
| `link_email` | string | Linked business email \(business profile\) |
| `work_email_confirmed` | string | Whether the work email is confirmed |
| `company_employee_count` | string | Company employee count |
| `company_employee_range` | string | Company employee range band |
| `company_revenue_range` | string | Company revenue range band |
| `md5` | string | MD5 hash of the resolved email |
### `rb2b_hem_to_business_profile`
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `credits_remaining` | number | API credits remaining \(Credit Check\) |
| `results` | json | Result list for IP/MAID/company/activity lookups |
| `match_count` | number | Number of matches \(Email to Last Active Date\) |
| `credits_charged` | number | Credits charged for the request |
| `credits_exhausted` | boolean | Whether the account is out of credits |
| `linkedin_url` | string | LinkedIn profile URL |
| `linkedin_slug` | string | LinkedIn slug |
| `email` | string | Best personal email |
| `emails` | array | Personal email addresses |
| `mobile_phone` | string | Mobile phone number |
| `business_md5_array` | array | MD5 hashes of business emails |
| `business_sha256_array` | array | SHA-256 hashes of business emails |
| `personal_md5_array` | array | MD5 hashes of personal emails |
| `personal_sha256_array` | array | SHA-256 hashes of personal emails |
| `first_name` | string | First name \(business profile\) |
| `last_name` | string | Last name \(business profile\) |
| `full_name` | string | Full name \(LinkedIn business profile\) |
| `headline` | string | LinkedIn headline |
| `title` | string | Job title |
| `seniority` | string | Seniority level |
| `country` | string | Country |
| `current_industry` | string | Current industry |
| `functional_area` | json | Functional area\(s\) |
| `current_company` | string | Current company name |
| `current_company_url` | string | Current company website |
| `current_company_linkedinurl` | string | Current company LinkedIn URL |
| `company` | json | Company details \(LinkedIn business profile\) |
| `business_email` | string | Business email address |
| `personal_email` | string | Personal email address |
| `personal_emails` | array | Personal emails \(business profile\) |
| `linkedinurl` | string | LinkedIn profile URL \(business profile\) |
| `link_email` | string | Linked business email \(business profile\) |
| `work_email_confirmed` | string | Whether the work email is confirmed |
| `company_employee_count` | string | Company employee count |
| `company_employee_range` | string | Company employee range band |
| `company_revenue_range` | string | Company revenue range band |
| `md5` | string | MD5 hash of the resolved email |
### `rb2b_hem_to_best_linkedin`
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `credits_remaining` | number | API credits remaining \(Credit Check\) |
| `results` | json | Result list for IP/MAID/company/activity lookups |
| `match_count` | number | Number of matches \(Email to Last Active Date\) |
| `credits_charged` | number | Credits charged for the request |
| `credits_exhausted` | boolean | Whether the account is out of credits |
| `linkedin_url` | string | LinkedIn profile URL |
| `linkedin_slug` | string | LinkedIn slug |
| `email` | string | Best personal email |
| `emails` | array | Personal email addresses |
| `mobile_phone` | string | Mobile phone number |
| `business_md5_array` | array | MD5 hashes of business emails |
| `business_sha256_array` | array | SHA-256 hashes of business emails |
| `personal_md5_array` | array | MD5 hashes of personal emails |
| `personal_sha256_array` | array | SHA-256 hashes of personal emails |
| `first_name` | string | First name \(business profile\) |
| `last_name` | string | Last name \(business profile\) |
| `full_name` | string | Full name \(LinkedIn business profile\) |
| `headline` | string | LinkedIn headline |
| `title` | string | Job title |
| `seniority` | string | Seniority level |
| `country` | string | Country |
| `current_industry` | string | Current industry |
| `functional_area` | json | Functional area\(s\) |
| `current_company` | string | Current company name |
| `current_company_url` | string | Current company website |
| `current_company_linkedinurl` | string | Current company LinkedIn URL |
| `company` | json | Company details \(LinkedIn business profile\) |
| `business_email` | string | Business email address |
| `personal_email` | string | Personal email address |
| `personal_emails` | array | Personal emails \(business profile\) |
| `linkedinurl` | string | LinkedIn profile URL \(business profile\) |
| `link_email` | string | Linked business email \(business profile\) |
| `work_email_confirmed` | string | Whether the work email is confirmed |
| `company_employee_count` | string | Company employee count |
| `company_employee_range` | string | Company employee range band |
| `company_revenue_range` | string | Company revenue range band |
| `md5` | string | MD5 hash of the resolved email |
### `rb2b_hem_to_linkedin`
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `credits_remaining` | number | API credits remaining \(Credit Check\) |
| `results` | json | Result list for IP/MAID/company/activity lookups |
| `match_count` | number | Number of matches \(Email to Last Active Date\) |
| `credits_charged` | number | Credits charged for the request |
| `credits_exhausted` | boolean | Whether the account is out of credits |
| `linkedin_url` | string | LinkedIn profile URL |
| `linkedin_slug` | string | LinkedIn slug |
| `email` | string | Best personal email |
| `emails` | array | Personal email addresses |
| `mobile_phone` | string | Mobile phone number |
| `business_md5_array` | array | MD5 hashes of business emails |
| `business_sha256_array` | array | SHA-256 hashes of business emails |
| `personal_md5_array` | array | MD5 hashes of personal emails |
| `personal_sha256_array` | array | SHA-256 hashes of personal emails |
| `first_name` | string | First name \(business profile\) |
| `last_name` | string | Last name \(business profile\) |
| `full_name` | string | Full name \(LinkedIn business profile\) |
| `headline` | string | LinkedIn headline |
| `title` | string | Job title |
| `seniority` | string | Seniority level |
| `country` | string | Country |
| `current_industry` | string | Current industry |
| `functional_area` | json | Functional area\(s\) |
| `current_company` | string | Current company name |
| `current_company_url` | string | Current company website |
| `current_company_linkedinurl` | string | Current company LinkedIn URL |
| `company` | json | Company details \(LinkedIn business profile\) |
| `business_email` | string | Business email address |
| `personal_email` | string | Personal email address |
| `personal_emails` | array | Personal emails \(business profile\) |
| `linkedinurl` | string | LinkedIn profile URL \(business profile\) |
| `link_email` | string | Linked business email \(business profile\) |
| `work_email_confirmed` | string | Whether the work email is confirmed |
| `company_employee_count` | string | Company employee count |
| `company_employee_range` | string | Company employee range band |
| `company_revenue_range` | string | Company revenue range band |
| `md5` | string | MD5 hash of the resolved email |
### `rb2b_hem_to_maid`
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `credits_remaining` | number | API credits remaining \(Credit Check\) |
| `results` | json | Result list for IP/MAID/company/activity lookups |
| `match_count` | number | Number of matches \(Email to Last Active Date\) |
| `credits_charged` | number | Credits charged for the request |
| `credits_exhausted` | boolean | Whether the account is out of credits |
| `linkedin_url` | string | LinkedIn profile URL |
| `linkedin_slug` | string | LinkedIn slug |
| `email` | string | Best personal email |
| `emails` | array | Personal email addresses |
| `mobile_phone` | string | Mobile phone number |
| `business_md5_array` | array | MD5 hashes of business emails |
| `business_sha256_array` | array | SHA-256 hashes of business emails |
| `personal_md5_array` | array | MD5 hashes of personal emails |
| `personal_sha256_array` | array | SHA-256 hashes of personal emails |
| `first_name` | string | First name \(business profile\) |
| `last_name` | string | Last name \(business profile\) |
| `full_name` | string | Full name \(LinkedIn business profile\) |
| `headline` | string | LinkedIn headline |
| `title` | string | Job title |
| `seniority` | string | Seniority level |
| `country` | string | Country |
| `current_industry` | string | Current industry |
| `functional_area` | json | Functional area\(s\) |
| `current_company` | string | Current company name |
| `current_company_url` | string | Current company website |
| `current_company_linkedinurl` | string | Current company LinkedIn URL |
| `company` | json | Company details \(LinkedIn business profile\) |
| `business_email` | string | Business email address |
| `personal_email` | string | Personal email address |
| `personal_emails` | array | Personal emails \(business profile\) |
| `linkedinurl` | string | LinkedIn profile URL \(business profile\) |
| `link_email` | string | Linked business email \(business profile\) |
| `work_email_confirmed` | string | Whether the work email is confirmed |
| `company_employee_count` | string | Company employee count |
| `company_employee_range` | string | Company employee range band |
| `company_revenue_range` | string | Company revenue range band |
| `md5` | string | MD5 hash of the resolved email |
### `rb2b_email_to_activity`
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `credits_remaining` | number | API credits remaining \(Credit Check\) |
| `results` | json | Result list for IP/MAID/company/activity lookups |
| `match_count` | number | Number of matches \(Email to Last Active Date\) |
| `credits_charged` | number | Credits charged for the request |
| `credits_exhausted` | boolean | Whether the account is out of credits |
| `linkedin_url` | string | LinkedIn profile URL |
| `linkedin_slug` | string | LinkedIn slug |
| `email` | string | Best personal email |
| `emails` | array | Personal email addresses |
| `mobile_phone` | string | Mobile phone number |
| `business_md5_array` | array | MD5 hashes of business emails |
| `business_sha256_array` | array | SHA-256 hashes of business emails |
| `personal_md5_array` | array | MD5 hashes of personal emails |
| `personal_sha256_array` | array | SHA-256 hashes of personal emails |
| `first_name` | string | First name \(business profile\) |
| `last_name` | string | Last name \(business profile\) |
| `full_name` | string | Full name \(LinkedIn business profile\) |
| `headline` | string | LinkedIn headline |
| `title` | string | Job title |
| `seniority` | string | Seniority level |
| `country` | string | Country |
| `current_industry` | string | Current industry |
| `functional_area` | json | Functional area\(s\) |
| `current_company` | string | Current company name |
| `current_company_url` | string | Current company website |
| `current_company_linkedinurl` | string | Current company LinkedIn URL |
| `company` | json | Company details \(LinkedIn business profile\) |
| `business_email` | string | Business email address |
| `personal_email` | string | Personal email address |
| `personal_emails` | array | Personal emails \(business profile\) |
| `linkedinurl` | string | LinkedIn profile URL \(business profile\) |
| `link_email` | string | Linked business email \(business profile\) |
| `work_email_confirmed` | string | Whether the work email is confirmed |
| `company_employee_count` | string | Company employee count |
| `company_employee_range` | string | Company employee range band |
| `company_revenue_range` | string | Company revenue range band |
| `md5` | string | MD5 hash of the resolved email |
### `rb2b_linkedin_to_business_profile`
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `credits_remaining` | number | API credits remaining \(Credit Check\) |
| `results` | json | Result list for IP/MAID/company/activity lookups |
| `match_count` | number | Number of matches \(Email to Last Active Date\) |
| `credits_charged` | number | Credits charged for the request |
| `credits_exhausted` | boolean | Whether the account is out of credits |
| `linkedin_url` | string | LinkedIn profile URL |
| `linkedin_slug` | string | LinkedIn slug |
| `email` | string | Best personal email |
| `emails` | array | Personal email addresses |
| `mobile_phone` | string | Mobile phone number |
| `business_md5_array` | array | MD5 hashes of business emails |
| `business_sha256_array` | array | SHA-256 hashes of business emails |
| `personal_md5_array` | array | MD5 hashes of personal emails |
| `personal_sha256_array` | array | SHA-256 hashes of personal emails |
| `first_name` | string | First name \(business profile\) |
| `last_name` | string | Last name \(business profile\) |
| `full_name` | string | Full name \(LinkedIn business profile\) |
| `headline` | string | LinkedIn headline |
| `title` | string | Job title |
| `seniority` | string | Seniority level |
| `country` | string | Country |
| `current_industry` | string | Current industry |
| `functional_area` | json | Functional area\(s\) |
| `current_company` | string | Current company name |
| `current_company_url` | string | Current company website |
| `current_company_linkedinurl` | string | Current company LinkedIn URL |
| `company` | json | Company details \(LinkedIn business profile\) |
| `business_email` | string | Business email address |
| `personal_email` | string | Personal email address |
| `personal_emails` | array | Personal emails \(business profile\) |
| `linkedinurl` | string | LinkedIn profile URL \(business profile\) |
| `link_email` | string | Linked business email \(business profile\) |
| `work_email_confirmed` | string | Whether the work email is confirmed |
| `company_employee_count` | string | Company employee count |
| `company_employee_range` | string | Company employee range band |
| `company_revenue_range` | string | Company revenue range band |
| `md5` | string | MD5 hash of the resolved email |
### `rb2b_linkedin_to_best_personal_email`
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `credits_remaining` | number | API credits remaining \(Credit Check\) |
| `results` | json | Result list for IP/MAID/company/activity lookups |
| `match_count` | number | Number of matches \(Email to Last Active Date\) |
| `credits_charged` | number | Credits charged for the request |
| `credits_exhausted` | boolean | Whether the account is out of credits |
| `linkedin_url` | string | LinkedIn profile URL |
| `linkedin_slug` | string | LinkedIn slug |
| `email` | string | Best personal email |
| `emails` | array | Personal email addresses |
| `mobile_phone` | string | Mobile phone number |
| `business_md5_array` | array | MD5 hashes of business emails |
| `business_sha256_array` | array | SHA-256 hashes of business emails |
| `personal_md5_array` | array | MD5 hashes of personal emails |
| `personal_sha256_array` | array | SHA-256 hashes of personal emails |
| `first_name` | string | First name \(business profile\) |
| `last_name` | string | Last name \(business profile\) |
| `full_name` | string | Full name \(LinkedIn business profile\) |
| `headline` | string | LinkedIn headline |
| `title` | string | Job title |
| `seniority` | string | Seniority level |
| `country` | string | Country |
| `current_industry` | string | Current industry |
| `functional_area` | json | Functional area\(s\) |
| `current_company` | string | Current company name |
| `current_company_url` | string | Current company website |
| `current_company_linkedinurl` | string | Current company LinkedIn URL |
| `company` | json | Company details \(LinkedIn business profile\) |
| `business_email` | string | Business email address |
| `personal_email` | string | Personal email address |
| `personal_emails` | array | Personal emails \(business profile\) |
| `linkedinurl` | string | LinkedIn profile URL \(business profile\) |
| `link_email` | string | Linked business email \(business profile\) |
| `work_email_confirmed` | string | Whether the work email is confirmed |
| `company_employee_count` | string | Company employee count |
| `company_employee_range` | string | Company employee range band |
| `company_revenue_range` | string | Company revenue range band |
| `md5` | string | MD5 hash of the resolved email |
### `rb2b_linkedin_to_personal_email`
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `credits_remaining` | number | API credits remaining \(Credit Check\) |
| `results` | json | Result list for IP/MAID/company/activity lookups |
| `match_count` | number | Number of matches \(Email to Last Active Date\) |
| `credits_charged` | number | Credits charged for the request |
| `credits_exhausted` | boolean | Whether the account is out of credits |
| `linkedin_url` | string | LinkedIn profile URL |
| `linkedin_slug` | string | LinkedIn slug |
| `email` | string | Best personal email |
| `emails` | array | Personal email addresses |
| `mobile_phone` | string | Mobile phone number |
| `business_md5_array` | array | MD5 hashes of business emails |
| `business_sha256_array` | array | SHA-256 hashes of business emails |
| `personal_md5_array` | array | MD5 hashes of personal emails |
| `personal_sha256_array` | array | SHA-256 hashes of personal emails |
| `first_name` | string | First name \(business profile\) |
| `last_name` | string | Last name \(business profile\) |
| `full_name` | string | Full name \(LinkedIn business profile\) |
| `headline` | string | LinkedIn headline |
| `title` | string | Job title |
| `seniority` | string | Seniority level |
| `country` | string | Country |
| `current_industry` | string | Current industry |
| `functional_area` | json | Functional area\(s\) |
| `current_company` | string | Current company name |
| `current_company_url` | string | Current company website |
| `current_company_linkedinurl` | string | Current company LinkedIn URL |
| `company` | json | Company details \(LinkedIn business profile\) |
| `business_email` | string | Business email address |
| `personal_email` | string | Personal email address |
| `personal_emails` | array | Personal emails \(business profile\) |
| `linkedinurl` | string | LinkedIn profile URL \(business profile\) |
| `link_email` | string | Linked business email \(business profile\) |
| `work_email_confirmed` | string | Whether the work email is confirmed |
| `company_employee_count` | string | Company employee count |
| `company_employee_range` | string | Company employee range band |
| `company_revenue_range` | string | Company revenue range band |
| `md5` | string | MD5 hash of the resolved email |
### `rb2b_linkedin_to_hashed_emails`
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `credits_remaining` | number | API credits remaining \(Credit Check\) |
| `results` | json | Result list for IP/MAID/company/activity lookups |
| `match_count` | number | Number of matches \(Email to Last Active Date\) |
| `credits_charged` | number | Credits charged for the request |
| `credits_exhausted` | boolean | Whether the account is out of credits |
| `linkedin_url` | string | LinkedIn profile URL |
| `linkedin_slug` | string | LinkedIn slug |
| `email` | string | Best personal email |
| `emails` | array | Personal email addresses |
| `mobile_phone` | string | Mobile phone number |
| `business_md5_array` | array | MD5 hashes of business emails |
| `business_sha256_array` | array | SHA-256 hashes of business emails |
| `personal_md5_array` | array | MD5 hashes of personal emails |
| `personal_sha256_array` | array | SHA-256 hashes of personal emails |
| `first_name` | string | First name \(business profile\) |
| `last_name` | string | Last name \(business profile\) |
| `full_name` | string | Full name \(LinkedIn business profile\) |
| `headline` | string | LinkedIn headline |
| `title` | string | Job title |
| `seniority` | string | Seniority level |
| `country` | string | Country |
| `current_industry` | string | Current industry |
| `functional_area` | json | Functional area\(s\) |
| `current_company` | string | Current company name |
| `current_company_url` | string | Current company website |
| `current_company_linkedinurl` | string | Current company LinkedIn URL |
| `company` | json | Company details \(LinkedIn business profile\) |
| `business_email` | string | Business email address |
| `personal_email` | string | Personal email address |
| `personal_emails` | array | Personal emails \(business profile\) |
| `linkedinurl` | string | LinkedIn profile URL \(business profile\) |
| `link_email` | string | Linked business email \(business profile\) |
| `work_email_confirmed` | string | Whether the work email is confirmed |
| `company_employee_count` | string | Company employee count |
| `company_employee_range` | string | Company employee range band |
| `company_revenue_range` | string | Company revenue range band |
| `md5` | string | MD5 hash of the resolved email |
### `rb2b_linkedin_to_mobile_phone`
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `credits_remaining` | number | API credits remaining \(Credit Check\) |
| `results` | json | Result list for IP/MAID/company/activity lookups |
| `match_count` | number | Number of matches \(Email to Last Active Date\) |
| `credits_charged` | number | Credits charged for the request |
| `credits_exhausted` | boolean | Whether the account is out of credits |
| `linkedin_url` | string | LinkedIn profile URL |
| `linkedin_slug` | string | LinkedIn slug |
| `email` | string | Best personal email |
| `emails` | array | Personal email addresses |
| `mobile_phone` | string | Mobile phone number |
| `business_md5_array` | array | MD5 hashes of business emails |
| `business_sha256_array` | array | SHA-256 hashes of business emails |
| `personal_md5_array` | array | MD5 hashes of personal emails |
| `personal_sha256_array` | array | SHA-256 hashes of personal emails |
| `first_name` | string | First name \(business profile\) |
| `last_name` | string | Last name \(business profile\) |
| `full_name` | string | Full name \(LinkedIn business profile\) |
| `headline` | string | LinkedIn headline |
| `title` | string | Job title |
| `seniority` | string | Seniority level |
| `country` | string | Country |
| `current_industry` | string | Current industry |
| `functional_area` | json | Functional area\(s\) |
| `current_company` | string | Current company name |
| `current_company_url` | string | Current company website |
| `current_company_linkedinurl` | string | Current company LinkedIn URL |
| `company` | json | Company details \(LinkedIn business profile\) |
| `business_email` | string | Business email address |
| `personal_email` | string | Personal email address |
| `personal_emails` | array | Personal emails \(business profile\) |
| `linkedinurl` | string | LinkedIn profile URL \(business profile\) |
| `link_email` | string | Linked business email \(business profile\) |
| `work_email_confirmed` | string | Whether the work email is confirmed |
| `company_employee_count` | string | Company employee count |
| `company_employee_range` | string | Company employee range band |
| `company_revenue_range` | string | Company revenue range band |
| `md5` | string | MD5 hash of the resolved email |
### `rb2b_linkedin_slug_search`
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `credits_remaining` | number | API credits remaining \(Credit Check\) |
| `results` | json | Result list for IP/MAID/company/activity lookups |
| `match_count` | number | Number of matches \(Email to Last Active Date\) |
| `credits_charged` | number | Credits charged for the request |
| `credits_exhausted` | boolean | Whether the account is out of credits |
| `linkedin_url` | string | LinkedIn profile URL |
| `linkedin_slug` | string | LinkedIn slug |
| `email` | string | Best personal email |
| `emails` | array | Personal email addresses |
| `mobile_phone` | string | Mobile phone number |
| `business_md5_array` | array | MD5 hashes of business emails |
| `business_sha256_array` | array | SHA-256 hashes of business emails |
| `personal_md5_array` | array | MD5 hashes of personal emails |
| `personal_sha256_array` | array | SHA-256 hashes of personal emails |
| `first_name` | string | First name \(business profile\) |
| `last_name` | string | Last name \(business profile\) |
| `full_name` | string | Full name \(LinkedIn business profile\) |
| `headline` | string | LinkedIn headline |
| `title` | string | Job title |
| `seniority` | string | Seniority level |
| `country` | string | Country |
| `current_industry` | string | Current industry |
| `functional_area` | json | Functional area\(s\) |
| `current_company` | string | Current company name |
| `current_company_url` | string | Current company website |
| `current_company_linkedinurl` | string | Current company LinkedIn URL |
| `company` | json | Company details \(LinkedIn business profile\) |
| `business_email` | string | Business email address |
| `personal_email` | string | Personal email address |
| `personal_emails` | array | Personal emails \(business profile\) |
| `linkedinurl` | string | LinkedIn profile URL \(business profile\) |
| `link_email` | string | Linked business email \(business profile\) |
| `work_email_confirmed` | string | Whether the work email is confirmed |
| `company_employee_count` | string | Company employee count |
| `company_employee_range` | string | Company employee range band |
| `company_revenue_range` | string | Company revenue range band |
| `md5` | string | MD5 hash of the resolved email |
@@ -151,6 +151,7 @@ import {
QdrantIcon,
QuiverIcon,
RailwayIcon,
RB2BIcon,
RDSIcon,
RedditIcon,
RedisIcon,
@@ -360,6 +361,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
qdrant: QdrantIcon,
quiver: QuiverIcon,
railway: RailwayIcon,
rb2b: RB2BIcon,
rds: RDSIcon,
reddit: RedditIcon,
redis: RedisIcon,
@@ -11000,6 +11000,85 @@
"integrationTypes": ["developer-tools"],
"tags": ["cloud", "ci-cd"]
},
{
"type": "rb2b",
"slug": "rb2b",
"name": "RB2B",
"description": "Identify and enrich website visitors",
"longDescription": "Resolve IP addresses, hashed emails, and LinkedIn profiles into person-level identity and B2B enrichment data using the RB2B API. Convert IPs to hashed emails, MAIDs, and company domains; enrich emails into LinkedIn profiles, business profiles, and mobile IDs; and look up emails or phone numbers from LinkedIn. Requires an RB2B API key.",
"bgColor": "#51FF00",
"iconName": "RB2BIcon",
"docsUrl": "https://docs.sim.ai/tools/rb2b",
"operations": [
{
"name": "Credit Check",
"description": "Check the number of API credits remaining on your RB2B account."
},
{
"name": "IP to HEM",
"description": "Convert an IP address (and optional user agent) into hashed email addresses (HEM) with accuracy scores."
},
{
"name": "IP to MAID",
"description": "Resolve an IP address (and optional user agent) into mobile advertising identifiers (MAIDs) observed over the last 60 days."
},
{
"name": "IP to Company",
"description": "Identify the company domains associated with an IP address, ranked by confidence."
},
{
"name": "Email/HEM to Business Profile",
"description": "Return a full business profile (name, title, company, industry, seniority and more) for an email address or MD5-hashed email."
},
{
"name": "Email/HEM to Best LinkedIn URL",
"description": "Return the most recently active LinkedIn profile URL for an email address or MD5-hashed email."
},
{
"name": "Email/HEM to LinkedIn Slug",
"description": "Return the LinkedIn slug (the profile identifier portion of the URL) for an email address or MD5-hashed email."
},
{
"name": "Email/HEM to MAID",
"description": "Return up to five mobile advertising identifiers (MAIDs) associated with an email address or MD5-hashed email."
},
{
"name": "Email to Last Active Date",
"description": "Return the last known active date for an email address."
},
{
"name": "LinkedIn to Business Profile",
"description": "Return a full business profile (name, title, company, emails and more) for a LinkedIn profile."
},
{
"name": "LinkedIn to Best Personal Email",
"description": "Return the personal email with the most recent known network activity for a LinkedIn profile."
},
{
"name": "LinkedIn to Personal Email",
"description": "Return the personal email addresses associated with a LinkedIn profile."
},
{
"name": "LinkedIn to Hashed Emails",
"description": "Return the business and personal hashed emails (MD5 and SHA-256) associated with a LinkedIn profile."
},
{
"name": "LinkedIn to Mobile Phone",
"description": "Return the mobile phone number with the most recent known network activity for a LinkedIn profile."
},
{
"name": "LinkedIn Slug Search",
"description": "Find a LinkedIn profile URL from a first name, last name, and company domain."
}
],
"operationCount": 15,
"triggers": [],
"triggerCount": 0,
"authType": "api-key",
"category": "tools",
"integrationTypes": ["sales", "security"],
"tags": ["enrichment", "identity", "sales-engagement"]
},
{
"type": "reddit",
"slug": "reddit",
+219
View File
@@ -0,0 +1,219 @@
import { RB2BIcon } from '@/components/icons'
import type { BlockConfig } from '@/blocks/types'
import { AuthMode, IntegrationType } from '@/blocks/types'
import type { Rb2bResponse } from '@/tools/rb2b/types'
const EMAIL_OPERATIONS = [
'hem_to_business_profile',
'hem_to_best_linkedin',
'hem_to_linkedin',
'hem_to_maid',
]
const LINKEDIN_OPERATIONS = [
'linkedin_to_business_profile',
'linkedin_to_best_personal_email',
'linkedin_to_personal_email',
'linkedin_to_hashed_emails',
'linkedin_to_mobile_phone',
]
const IP_OPERATIONS = ['ip_to_hem', 'ip_to_maid', 'ip_to_company']
export const RB2BBlock: BlockConfig<Rb2bResponse> = {
type: 'rb2b',
name: 'RB2B',
description: 'Identify and enrich website visitors',
authMode: AuthMode.ApiKey,
longDescription:
'Resolve IP addresses, hashed emails, and LinkedIn profiles into person-level identity and B2B enrichment data using the RB2B API. Convert IPs to hashed emails, MAIDs, and company domains; enrich emails into LinkedIn profiles, business profiles, and mobile IDs; and look up emails or phone numbers from LinkedIn. Requires an RB2B API key.',
category: 'tools',
integrationType: IntegrationType.Sales,
tags: ['enrichment', 'identity', 'sales-engagement'],
docsLink: 'https://docs.sim.ai/tools/rb2b',
bgColor: '#51FF00',
icon: RB2BIcon,
subBlocks: [
{
id: 'operation',
title: 'Operation',
type: 'dropdown',
options: [
{ label: 'Credit Check', id: 'credit_check' },
{ label: 'IP to HEM', id: 'ip_to_hem' },
{ label: 'IP to MAID', id: 'ip_to_maid' },
{ label: 'IP to Company', id: 'ip_to_company' },
{ label: 'Email/HEM to Business Profile', id: 'hem_to_business_profile' },
{ label: 'Email/HEM to Best LinkedIn URL', id: 'hem_to_best_linkedin' },
{ label: 'Email/HEM to LinkedIn Slug', id: 'hem_to_linkedin' },
{ label: 'Email/HEM to MAID', id: 'hem_to_maid' },
{ label: 'Email to Last Active Date', id: 'email_to_activity' },
{ label: 'LinkedIn to Business Profile', id: 'linkedin_to_business_profile' },
{ label: 'LinkedIn to Best Personal Email', id: 'linkedin_to_best_personal_email' },
{ label: 'LinkedIn to Personal Email', id: 'linkedin_to_personal_email' },
{ label: 'LinkedIn to Hashed Emails', id: 'linkedin_to_hashed_emails' },
{ label: 'LinkedIn to Mobile Phone', id: 'linkedin_to_mobile_phone' },
{ label: 'LinkedIn Slug Search', id: 'linkedin_slug_search' },
],
value: () => 'ip_to_hem',
},
{
id: 'ip_address',
title: 'IP Address',
type: 'short-input',
placeholder: 'e.g. 162.192.6.240',
condition: { field: 'operation', value: IP_OPERATIONS },
required: { field: 'operation', value: IP_OPERATIONS },
},
{
id: 'user_agent',
title: 'User Agent',
type: 'short-input',
placeholder: 'Optional user agent string',
condition: { field: 'operation', value: ['ip_to_hem', 'ip_to_maid'] },
},
{
id: 'include_sha256',
title: 'Include SHA-256 Hashes',
type: 'switch',
condition: { field: 'operation', value: 'ip_to_hem' },
},
{
id: 'email',
title: 'Email or MD5 Hash',
type: 'short-input',
placeholder: 'jane@example.com or an MD5 hash',
condition: { field: 'operation', value: EMAIL_OPERATIONS },
required: { field: 'operation', value: EMAIL_OPERATIONS },
},
{
id: 'emailAddress',
title: 'Email Address',
type: 'short-input',
placeholder: 'jane@example.com',
condition: { field: 'operation', value: 'email_to_activity' },
required: { field: 'operation', value: 'email_to_activity' },
},
{
id: 'linkedin_slug',
title: 'LinkedIn Slug or URL',
type: 'short-input',
placeholder: 'e.g. firstname-lastname or full profile URL',
condition: { field: 'operation', value: LINKEDIN_OPERATIONS },
required: { field: 'operation', value: LINKEDIN_OPERATIONS },
},
{
id: 'first_name',
title: 'First Name',
type: 'short-input',
placeholder: 'Jane',
condition: { field: 'operation', value: 'linkedin_slug_search' },
required: { field: 'operation', value: 'linkedin_slug_search' },
},
{
id: 'last_name',
title: 'Last Name',
type: 'short-input',
placeholder: 'Doe',
condition: { field: 'operation', value: 'linkedin_slug_search' },
required: { field: 'operation', value: 'linkedin_slug_search' },
},
{
id: 'company_domain',
title: 'Company Domain',
type: 'short-input',
placeholder: 'example.com',
condition: { field: 'operation', value: 'linkedin_slug_search' },
required: { field: 'operation', value: 'linkedin_slug_search' },
},
{
id: 'apiKey',
title: 'API Key',
type: 'short-input',
placeholder: 'Enter your RB2B API key',
password: true,
required: true,
},
],
tools: {
access: [
'rb2b_credit_check',
'rb2b_ip_to_hem',
'rb2b_ip_to_maid',
'rb2b_ip_to_company',
'rb2b_hem_to_business_profile',
'rb2b_hem_to_best_linkedin',
'rb2b_hem_to_linkedin',
'rb2b_hem_to_maid',
'rb2b_email_to_activity',
'rb2b_linkedin_to_business_profile',
'rb2b_linkedin_to_best_personal_email',
'rb2b_linkedin_to_personal_email',
'rb2b_linkedin_to_hashed_emails',
'rb2b_linkedin_to_mobile_phone',
'rb2b_linkedin_slug_search',
],
config: {
tool: (params) => `rb2b_${params.operation}`,
params: (params) => {
const email = params.email ?? params.emailAddress
return email !== undefined ? { email } : {}
},
},
},
inputs: {
operation: { type: 'string', description: 'Operation to perform' },
apiKey: { type: 'string', description: 'RB2B API key' },
ip_address: { type: 'string', description: 'IP address to resolve' },
user_agent: { type: 'string', description: 'Optional user agent string' },
include_sha256: { type: 'boolean', description: 'Include SHA-256 hashes (IP to HEM)' },
email: { type: 'string', description: 'Email address or MD5 hash (HEM operations)' },
emailAddress: { type: 'string', description: 'Email address (Email to Last Active Date)' },
linkedin_slug: { type: 'string', description: 'LinkedIn profile slug or URL' },
first_name: { type: 'string', description: 'First name (LinkedIn Slug Search)' },
last_name: { type: 'string', description: 'Last name (LinkedIn Slug Search)' },
company_domain: { type: 'string', description: 'Company domain (LinkedIn Slug Search)' },
},
outputs: {
credits_remaining: { type: 'number', description: 'API credits remaining (Credit Check)' },
results: {
type: 'json',
description: 'Result list for IP/MAID/company/activity lookups',
},
match_count: { type: 'number', description: 'Number of matches (Email to Last Active Date)' },
credits_charged: { type: 'number', description: 'Credits charged for the request' },
credits_exhausted: { type: 'boolean', description: 'Whether the account is out of credits' },
linkedin_url: { type: 'string', description: 'LinkedIn profile URL' },
linkedin_slug: { type: 'string', description: 'LinkedIn slug' },
email: { type: 'string', description: 'Best personal email' },
emails: { type: 'array', description: 'Personal email addresses' },
mobile_phone: { type: 'string', description: 'Mobile phone number' },
business_md5_array: { type: 'array', description: 'MD5 hashes of business emails' },
business_sha256_array: { type: 'array', description: 'SHA-256 hashes of business emails' },
personal_md5_array: { type: 'array', description: 'MD5 hashes of personal emails' },
personal_sha256_array: { type: 'array', description: 'SHA-256 hashes of personal emails' },
first_name: { type: 'string', description: 'First name (business profile)' },
last_name: { type: 'string', description: 'Last name (business profile)' },
full_name: { type: 'string', description: 'Full name (LinkedIn business profile)' },
headline: { type: 'string', description: 'LinkedIn headline' },
title: { type: 'string', description: 'Job title' },
seniority: { type: 'string', description: 'Seniority level' },
country: { type: 'string', description: 'Country' },
current_industry: { type: 'string', description: 'Current industry' },
functional_area: { type: 'json', description: 'Functional area(s)' },
current_company: { type: 'string', description: 'Current company name' },
current_company_url: { type: 'string', description: 'Current company website' },
current_company_linkedinurl: { type: 'string', description: 'Current company LinkedIn URL' },
company: { type: 'json', description: 'Company details (LinkedIn business profile)' },
business_email: { type: 'string', description: 'Business email address' },
personal_email: { type: 'string', description: 'Personal email address' },
personal_emails: { type: 'array', description: 'Personal emails (business profile)' },
linkedinurl: { type: 'string', description: 'LinkedIn profile URL (business profile)' },
link_email: { type: 'string', description: 'Linked business email (business profile)' },
work_email_confirmed: { type: 'string', description: 'Whether the work email is confirmed' },
company_employee_count: { type: 'string', description: 'Company employee count' },
company_employee_range: { type: 'string', description: 'Company employee range band' },
company_revenue_range: { type: 'string', description: 'Company revenue range band' },
md5: { type: 'string', description: 'MD5 hash of the resolved email' },
},
}
+2
View File
@@ -165,6 +165,7 @@ import { PulseBlock, PulseV2Block } from '@/blocks/blocks/pulse'
import { QdrantBlock } from '@/blocks/blocks/qdrant'
import { QuiverBlock } from '@/blocks/blocks/quiver'
import { RailwayBlock } from '@/blocks/blocks/railway'
import { RB2BBlock } from '@/blocks/blocks/rb2b'
import { RDSBlock } from '@/blocks/blocks/rds'
import { RedditBlock } from '@/blocks/blocks/reddit'
import { RedisBlock } from '@/blocks/blocks/redis'
@@ -432,6 +433,7 @@ export const registry: Record<string, BlockConfig> = {
qdrant: QdrantBlock,
quiver: QuiverBlock,
railway: RailwayBlock,
rb2b: RB2BBlock,
rds: RDSBlock,
reddit: RedditBlock,
redis: RedisBlock,
+43 -1
View File
@@ -1574,6 +1574,48 @@ export function ExaAIIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function RB2BIcon(props: SVGProps<SVGSVGElement>) {
const id = useId()
const clipId = `rb2b_clip_${id}`
return (
<svg viewBox='0 0 165 48' fill='none' xmlns='http://www.w3.org/2000/svg' {...props}>
<g clipPath={`url(#${clipId})`}>
<path d='M95.975 8.40234H87.5703V16.8057H95.975V8.40234Z' fill='#0C1316' />
<path d='M121.405 8.40234H113V16.8057H121.405V8.40234Z' fill='#0C1316' />
<path d='M112.998 16.8066H104.594V25.21H112.998V16.8066Z' fill='#0C1316' />
<path d='M104.596 25.2109H96.1914V33.6143H104.596V25.2109Z' fill='#0C1316' />
<path
d='M87.7852 39.5965V42.0166V47.9998H121.404V39.5965H96.1898V33.6133H87.7852V39.5965Z'
fill='#0C1316'
/>
<path d='M112.786 0H95.9766V8.40336H112.786V0Z' fill='#0C1316' />
<path
d='M52.3773 8.40336H74.3639V0H52.3773H43.9727V48H52.3773H74.3639V39.5966H52.3773V28.2017H74.3639V19.7983H52.3773V8.40336Z'
fill='#0C1316'
/>
<path d='M82.7718 8.40234H74.3672V19.7973H82.7718V8.40234Z' fill='#0C1316' />
<path d='M82.7679 28.2031H74.3633V39.5981H82.7679V28.2031Z' fill='#0C1316' />
<path d='M164.998 8.40234H156.594V19.7973H164.998V8.40234Z' fill='#0C1316' />
<path d='M164.998 28.2031H156.594V39.5981H164.998V28.2031Z' fill='#0C1316' />
<path
d='M134.608 19.7983V8.40336H156.594V0H134.608H126.203V48H134.608H156.594V39.5966H134.608V28.2017H156.594V19.7983H134.608Z'
fill='#0C1316'
/>
<path
d='M8.40464 8.40336H30.3912V0H8.40464H0V48H8.40464V28.2017H21.9866V36.605H30.3912V48H38.7958V28.2017H30.3912V19.7983H8.40464V8.40336Z'
fill='#0C1316'
/>
<path d='M38.7953 8.40234H30.3906V19.7973H38.7953V8.40234Z' fill='#0C1316' />
</g>
<defs>
<clipPath id={clipId}>
<rect width='165' height='48' fill='white' />
</clipPath>
</defs>
</svg>
)
}
export function RedditIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
@@ -4689,7 +4731,7 @@ export function ZoomInfoIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
{...props}
viewBox='0 0 65 65'
viewBox='0.272461 0.272461 64 64'
fill='none'
xmlns='http://www.w3.org/2000/svg'
aria-hidden='true'
+42
View File
@@ -0,0 +1,42 @@
import type { Rb2bCreditCheckParams, Rb2bCreditCheckResponse } from '@/tools/rb2b/types'
import { RB2B_API_BASE, rb2bHeaders } from '@/tools/rb2b/utils'
import type { ToolConfig } from '@/tools/types'
export const rb2bCreditCheckTool: ToolConfig<Rb2bCreditCheckParams, Rb2bCreditCheckResponse> = {
id: 'rb2b_credit_check',
name: 'RB2B Credit Check',
description: 'Check the number of API credits remaining on your RB2B account.',
version: '1.0.0',
params: {
apiKey: {
type: 'string',
required: true,
visibility: 'user-only',
description: 'RB2B API key',
},
},
request: {
method: 'GET',
url: `${RB2B_API_BASE}/credits`,
headers: (params) => rb2bHeaders(params.apiKey),
},
transformResponse: async (response: Response) => {
const data = await response.json()
return {
success: true,
output: {
credits_remaining: data.credits_remaining ?? 0,
},
}
},
outputs: {
credits_remaining: {
type: 'number',
description: 'Number of API credits remaining on the account',
},
},
}
+63
View File
@@ -0,0 +1,63 @@
import {
RB2B_ACTIVITY_RESULT_OUTPUT_PROPERTIES,
type Rb2bEmailActivityParams,
type Rb2bEmailActivityResponse,
} from '@/tools/rb2b/types'
import { RB2B_API_BASE, rb2bHeaders } from '@/tools/rb2b/utils'
import type { ToolConfig } from '@/tools/types'
export const rb2bEmailToActivityTool: ToolConfig<
Rb2bEmailActivityParams,
Rb2bEmailActivityResponse
> = {
id: 'rb2b_email_to_activity',
name: 'RB2B Email to Last Active Date',
description: 'Return the last known active date for an email address.',
version: '1.0.0',
params: {
apiKey: {
type: 'string',
required: true,
visibility: 'user-only',
description: 'RB2B API key',
},
email: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'The email address to look up',
},
},
request: {
method: 'POST',
url: `${RB2B_API_BASE}/email_to_activity`,
headers: (params) => rb2bHeaders(params.apiKey),
body: (params) => ({ email: params.email }),
},
transformResponse: async (response: Response) => {
const data = await response.json()
return {
success: true,
output: {
results: data.results ?? [],
match_count: data.match_count ?? 0,
credits_charged: data.credits_charged ?? 0,
credits_exhausted: data.credits_exhausted ?? false,
},
}
},
outputs: {
results: {
type: 'array',
description: 'Activity records for the email',
items: { type: 'object', properties: RB2B_ACTIVITY_RESULT_OUTPUT_PROPERTIES },
},
match_count: { type: 'number', description: 'Number of matches found' },
credits_charged: { type: 'number', description: 'Credits charged for this request' },
credits_exhausted: { type: 'boolean', description: 'Whether the account is out of credits' },
},
}
@@ -0,0 +1,52 @@
import type { Rb2bIdentifierParams, Rb2bLinkedinUrlResponse } from '@/tools/rb2b/types'
import { buildIdentifierBody, RB2B_API_BASE, rb2bHeaders } from '@/tools/rb2b/utils'
import type { ToolConfig } from '@/tools/types'
export const rb2bHemToBestLinkedinTool: ToolConfig<Rb2bIdentifierParams, Rb2bLinkedinUrlResponse> =
{
id: 'rb2b_hem_to_best_linkedin',
name: 'RB2B Email/HEM to Best LinkedIn URL',
description:
'Return the most recently active LinkedIn profile URL for an email address or MD5-hashed email.',
version: '1.0.0',
params: {
apiKey: {
type: 'string',
required: true,
visibility: 'user-only',
description: 'RB2B API key',
},
email: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'A plaintext email address or an MD5 hash of the email',
},
},
request: {
method: 'POST',
url: `${RB2B_API_BASE}/hem_to_best_linkedin`,
headers: (params) => rb2bHeaders(params.apiKey),
body: (params) => buildIdentifierBody(params.email),
},
transformResponse: async (response: Response) => {
const data = await response.json()
return {
success: true,
output: {
linkedin_url: data.results?.linkedin_url ?? null,
},
}
},
outputs: {
linkedin_url: {
type: 'string',
description: 'Best LinkedIn profile URL for the email',
optional: true,
},
},
}
@@ -0,0 +1,70 @@
import {
RB2B_BUSINESS_PROFILE_OUTPUT_PROPERTIES,
type Rb2bBusinessProfileResponse,
type Rb2bIdentifierParams,
} from '@/tools/rb2b/types'
import { buildIdentifierBody, RB2B_API_BASE, rb2bHeaders } from '@/tools/rb2b/utils'
import type { ToolConfig } from '@/tools/types'
export const rb2bHemToBusinessProfileTool: ToolConfig<
Rb2bIdentifierParams,
Rb2bBusinessProfileResponse
> = {
id: 'rb2b_hem_to_business_profile',
name: 'RB2B Email/HEM to Business Profile',
description:
'Return a full business profile (name, title, company, industry, seniority and more) for an email address or MD5-hashed email.',
version: '1.0.0',
params: {
apiKey: {
type: 'string',
required: true,
visibility: 'user-only',
description: 'RB2B API key',
},
email: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'A plaintext email address or an MD5 hash of the email',
},
},
request: {
method: 'POST',
url: `${RB2B_API_BASE}/hem_to_business_profile`,
headers: (params) => rb2bHeaders(params.apiKey),
body: (params) => buildIdentifierBody(params.email),
},
transformResponse: async (response: Response) => {
const data = await response.json()
const result = data.result ?? {}
return {
success: true,
output: {
first_name: result.first_name ?? undefined,
last_name: result.last_name ?? undefined,
title: result.title ?? undefined,
seniority: result.seniority ?? undefined,
linkedinurl: result.linkedinurl ?? undefined,
link_email: result.link_email ?? undefined,
work_email_confirmed: result.work_email_confirmed ?? undefined,
personal_emails: result.personal_emails ?? [],
current_company: result.current_company ?? undefined,
current_company_url: result.current_company_url ?? undefined,
current_company_linkedinurl: result.current_company_linkedinurl ?? undefined,
current_industry: result.current_industry ?? undefined,
functional_area: result.functional_area ?? undefined,
country: result.country ?? undefined,
company_employee_count: result.company_employee_count ?? undefined,
company_employee_range: result.company_employee_range ?? undefined,
company_revenue_range: result.company_revenue_range ?? undefined,
md5: result.md5 ?? undefined,
},
}
},
outputs: RB2B_BUSINESS_PROFILE_OUTPUT_PROPERTIES,
}
+51
View File
@@ -0,0 +1,51 @@
import type { Rb2bIdentifierParams, Rb2bLinkedinSlugResponse } from '@/tools/rb2b/types'
import { buildIdentifierBody, RB2B_API_BASE, rb2bHeaders } from '@/tools/rb2b/utils'
import type { ToolConfig } from '@/tools/types'
export const rb2bHemToLinkedinTool: ToolConfig<Rb2bIdentifierParams, Rb2bLinkedinSlugResponse> = {
id: 'rb2b_hem_to_linkedin',
name: 'RB2B Email/HEM to LinkedIn Slug',
description:
'Return the LinkedIn slug (the profile identifier portion of the URL) for an email address or MD5-hashed email.',
version: '1.0.0',
params: {
apiKey: {
type: 'string',
required: true,
visibility: 'user-only',
description: 'RB2B API key',
},
email: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'A plaintext email address or an MD5 hash of the email',
},
},
request: {
method: 'POST',
url: `${RB2B_API_BASE}/hem_to_linkedin`,
headers: (params) => rb2bHeaders(params.apiKey),
body: (params) => buildIdentifierBody(params.email),
},
transformResponse: async (response: Response) => {
const data = await response.json()
return {
success: true,
output: {
linkedin_slug: data.results?.linkedin_slug ?? null,
},
}
},
outputs: {
linkedin_slug: {
type: 'string',
description: 'LinkedIn slug for the email',
optional: true,
},
},
}
+55
View File
@@ -0,0 +1,55 @@
import {
RB2B_MAID_RESULT_OUTPUT_PROPERTIES,
type Rb2bIdentifierParams,
type Rb2bMaidResponse,
} from '@/tools/rb2b/types'
import { buildIdentifierBody, RB2B_API_BASE, rb2bHeaders } from '@/tools/rb2b/utils'
import type { ToolConfig } from '@/tools/types'
export const rb2bHemToMaidTool: ToolConfig<Rb2bIdentifierParams, Rb2bMaidResponse> = {
id: 'rb2b_hem_to_maid',
name: 'RB2B Email/HEM to MAID',
description:
'Return up to five mobile advertising identifiers (MAIDs) associated with an email address or MD5-hashed email.',
version: '1.0.0',
params: {
apiKey: {
type: 'string',
required: true,
visibility: 'user-only',
description: 'RB2B API key',
},
email: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'A plaintext email address or an MD5 hash of the email',
},
},
request: {
method: 'POST',
url: `${RB2B_API_BASE}/hem_to_maid`,
headers: (params) => rb2bHeaders(params.apiKey),
body: (params) => buildIdentifierBody(params.email),
},
transformResponse: async (response: Response) => {
const data = await response.json()
return {
success: true,
output: {
results: data.results ?? [],
},
}
},
outputs: {
results: {
type: 'array',
description: 'Mobile advertising identifiers associated with the email',
items: { type: 'object', properties: RB2B_MAID_RESULT_OUTPUT_PROPERTIES },
},
},
}
+15
View File
@@ -0,0 +1,15 @@
export { rb2bCreditCheckTool } from '@/tools/rb2b/credit-check'
export { rb2bEmailToActivityTool } from '@/tools/rb2b/email-to-activity'
export { rb2bHemToBestLinkedinTool } from '@/tools/rb2b/hem-to-best-linkedin'
export { rb2bHemToBusinessProfileTool } from '@/tools/rb2b/hem-to-business-profile'
export { rb2bHemToLinkedinTool } from '@/tools/rb2b/hem-to-linkedin'
export { rb2bHemToMaidTool } from '@/tools/rb2b/hem-to-maid'
export { rb2bIpToCompanyTool } from '@/tools/rb2b/ip-to-company'
export { rb2bIpToHemTool } from '@/tools/rb2b/ip-to-hem'
export { rb2bIpToMaidTool } from '@/tools/rb2b/ip-to-maid'
export { rb2bLinkedinSlugSearchTool } from '@/tools/rb2b/linkedin-slug-search'
export { rb2bLinkedinToBestPersonalEmailTool } from '@/tools/rb2b/linkedin-to-best-personal-email'
export { rb2bLinkedinToBusinessProfileTool } from '@/tools/rb2b/linkedin-to-business-profile'
export { rb2bLinkedinToHashedEmailsTool } from '@/tools/rb2b/linkedin-to-hashed-emails'
export { rb2bLinkedinToMobilePhoneTool } from '@/tools/rb2b/linkedin-to-mobile-phone'
export { rb2bLinkedinToPersonalEmailTool } from '@/tools/rb2b/linkedin-to-personal-email'
+54
View File
@@ -0,0 +1,54 @@
import {
RB2B_COMPANY_RESULT_OUTPUT_PROPERTIES,
type Rb2bIpToCompanyParams,
type Rb2bIpToCompanyResponse,
} from '@/tools/rb2b/types'
import { RB2B_API_BASE, rb2bHeaders } from '@/tools/rb2b/utils'
import type { ToolConfig } from '@/tools/types'
export const rb2bIpToCompanyTool: ToolConfig<Rb2bIpToCompanyParams, Rb2bIpToCompanyResponse> = {
id: 'rb2b_ip_to_company',
name: 'RB2B IP to Company',
description: 'Identify the company domains associated with an IP address, ranked by confidence.',
version: '1.0.0',
params: {
apiKey: {
type: 'string',
required: true,
visibility: 'user-only',
description: 'RB2B API key',
},
ip_address: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'The IP address to resolve (IPv4 or IPv6)',
},
},
request: {
method: 'POST',
url: `${RB2B_API_BASE}/ip_to_company`,
headers: (params) => rb2bHeaders(params.apiKey),
body: (params) => ({ ip_address: params.ip_address }),
},
transformResponse: async (response: Response) => {
const data = await response.json()
return {
success: true,
output: {
results: data.results ?? [],
},
}
},
outputs: {
results: {
type: 'array',
description: 'Company domain matches for the IP address',
items: { type: 'object', properties: RB2B_COMPANY_RESULT_OUTPUT_PROPERTIES },
},
},
}
+72
View File
@@ -0,0 +1,72 @@
import {
RB2B_HEM_RESULT_OUTPUT_PROPERTIES,
type Rb2bIpToHemParams,
type Rb2bIpToHemResponse,
} from '@/tools/rb2b/types'
import { RB2B_API_BASE, rb2bHeaders } from '@/tools/rb2b/utils'
import type { ToolConfig } from '@/tools/types'
export const rb2bIpToHemTool: ToolConfig<Rb2bIpToHemParams, Rb2bIpToHemResponse> = {
id: 'rb2b_ip_to_hem',
name: 'RB2B IP to HEM',
description:
'Convert an IP address (and optional user agent) into hashed email addresses (HEM) with accuracy scores.',
version: '1.0.0',
params: {
apiKey: {
type: 'string',
required: true,
visibility: 'user-only',
description: 'RB2B API key',
},
ip_address: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'The IP address to resolve (IPv4 or IPv6)',
},
user_agent: {
type: 'string',
required: false,
visibility: 'user-or-llm',
description: 'Optional user agent string to improve match accuracy',
},
include_sha256: {
type: 'boolean',
required: false,
visibility: 'user-or-llm',
description: 'Whether to include SHA-256 hashes in addition to MD5 hashes',
},
},
request: {
method: 'POST',
url: `${RB2B_API_BASE}/ip_to_hem`,
headers: (params) => rb2bHeaders(params.apiKey),
body: (params) => {
const body: Record<string, any> = { ip_address: params.ip_address }
if (params.user_agent) body.user_agent = params.user_agent
if (typeof params.include_sha256 === 'boolean') body.include_sha256 = params.include_sha256
return body
},
},
transformResponse: async (response: Response) => {
const data = await response.json()
return {
success: true,
output: {
results: data.results ?? [],
},
}
},
outputs: {
results: {
type: 'array',
description: 'Up to 3 hashed email matches for the IP address',
items: { type: 'object', properties: RB2B_HEM_RESULT_OUTPUT_PROPERTIES },
},
},
}
+65
View File
@@ -0,0 +1,65 @@
import {
RB2B_MAID_RESULT_OUTPUT_PROPERTIES,
type Rb2bIpToMaidParams,
type Rb2bMaidResponse,
} from '@/tools/rb2b/types'
import { RB2B_API_BASE, rb2bHeaders } from '@/tools/rb2b/utils'
import type { ToolConfig } from '@/tools/types'
export const rb2bIpToMaidTool: ToolConfig<Rb2bIpToMaidParams, Rb2bMaidResponse> = {
id: 'rb2b_ip_to_maid',
name: 'RB2B IP to MAID',
description:
'Resolve an IP address (and optional user agent) into mobile advertising identifiers (MAIDs) observed over the last 60 days.',
version: '1.0.0',
params: {
apiKey: {
type: 'string',
required: true,
visibility: 'user-only',
description: 'RB2B API key',
},
ip_address: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'The IP address to resolve (IPv4 or IPv6)',
},
user_agent: {
type: 'string',
required: false,
visibility: 'user-or-llm',
description: 'Optional user agent string to improve match accuracy',
},
},
request: {
method: 'POST',
url: `${RB2B_API_BASE}/ip_to_maid`,
headers: (params) => rb2bHeaders(params.apiKey),
body: (params) => {
const body: Record<string, any> = { ip_address: params.ip_address }
if (params.user_agent) body.user_agent = params.user_agent
return body
},
},
transformResponse: async (response: Response) => {
const data = await response.json()
return {
success: true,
output: {
results: data.results ?? [],
},
}
},
outputs: {
results: {
type: 'array',
description: 'Mobile advertising identifiers observed for the IP address',
items: { type: 'object', properties: RB2B_MAID_RESULT_OUTPUT_PROPERTIES },
},
},
}
@@ -0,0 +1,72 @@
import type {
Rb2bLinkedinSlugSearchParams,
Rb2bLinkedinSlugSearchResponse,
} from '@/tools/rb2b/types'
import { RB2B_API_BASE, rb2bHeaders } from '@/tools/rb2b/utils'
import type { ToolConfig } from '@/tools/types'
export const rb2bLinkedinSlugSearchTool: ToolConfig<
Rb2bLinkedinSlugSearchParams,
Rb2bLinkedinSlugSearchResponse
> = {
id: 'rb2b_linkedin_slug_search',
name: 'RB2B LinkedIn Slug Search',
description: 'Find a LinkedIn profile URL from a first name, last name, and company domain.',
version: '1.0.0',
params: {
apiKey: {
type: 'string',
required: true,
visibility: 'user-only',
description: 'RB2B API key',
},
first_name: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'The person’s first name',
},
last_name: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'The person’s last name',
},
company_domain: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'The company domain (e.g. example.com)',
},
},
request: {
method: 'POST',
url: `${RB2B_API_BASE}/linkedin_slug_search`,
headers: (params) => rb2bHeaders(params.apiKey),
body: (params) => ({
first_name: params.first_name,
last_name: params.last_name,
company_domain: params.company_domain,
}),
},
transformResponse: async (response: Response) => {
const data = await response.json()
return {
success: true,
output: {
linkedin_url: data.result?.linkedin_url ?? null,
},
}
},
outputs: {
linkedin_url: {
type: 'string',
description: 'LinkedIn profile URL for the person',
optional: true,
},
},
}
@@ -0,0 +1,54 @@
import type { Rb2bBestPersonalEmailResponse, Rb2bLinkedinParams } from '@/tools/rb2b/types'
import { RB2B_API_BASE, rb2bHeaders } from '@/tools/rb2b/utils'
import type { ToolConfig } from '@/tools/types'
export const rb2bLinkedinToBestPersonalEmailTool: ToolConfig<
Rb2bLinkedinParams,
Rb2bBestPersonalEmailResponse
> = {
id: 'rb2b_linkedin_to_best_personal_email',
name: 'RB2B LinkedIn to Best Personal Email',
description:
'Return the personal email with the most recent known network activity for a LinkedIn profile.',
version: '1.0.0',
params: {
apiKey: {
type: 'string',
required: true,
visibility: 'user-only',
description: 'RB2B API key',
},
linkedin_slug: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'The LinkedIn profile slug or URL',
},
},
request: {
method: 'POST',
url: `${RB2B_API_BASE}/linkedin_to_best_personal_email`,
headers: (params) => rb2bHeaders(params.apiKey),
body: (params) => ({ linkedin_slug: params.linkedin_slug }),
},
transformResponse: async (response: Response) => {
const data = await response.json()
return {
success: true,
output: {
email: data.result?.email ?? null,
},
}
},
outputs: {
email: {
type: 'string',
description: 'Best personal email for the LinkedIn profile',
optional: true,
},
},
}
@@ -0,0 +1,65 @@
import {
RB2B_LINKEDIN_PROFILE_OUTPUT_PROPERTIES,
type Rb2bLinkedinParams,
type Rb2bLinkedinProfileResponse,
} from '@/tools/rb2b/types'
import { RB2B_API_BASE, rb2bHeaders } from '@/tools/rb2b/utils'
import type { ToolConfig } from '@/tools/types'
export const rb2bLinkedinToBusinessProfileTool: ToolConfig<
Rb2bLinkedinParams,
Rb2bLinkedinProfileResponse
> = {
id: 'rb2b_linkedin_to_business_profile',
name: 'RB2B LinkedIn to Business Profile',
description:
'Return a full business profile (name, title, company, emails and more) for a LinkedIn profile.',
version: '1.0.0',
params: {
apiKey: {
type: 'string',
required: true,
visibility: 'user-only',
description: 'RB2B API key',
},
linkedin_slug: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'The LinkedIn profile slug or URL',
},
},
request: {
method: 'POST',
url: `${RB2B_API_BASE}/linkedin_to_business_profile`,
headers: (params) => rb2bHeaders(params.apiKey),
body: (params) => ({ linkedin_slug: params.linkedin_slug }),
},
transformResponse: async (response: Response) => {
const data = await response.json()
const result = data.result ?? {}
return {
success: true,
output: {
first_name: result.first_name ?? undefined,
last_name: result.last_name ?? undefined,
full_name: result.full_name ?? undefined,
headline: result.headline ?? undefined,
title: result.title ?? undefined,
seniority: result.seniority ?? undefined,
country: result.country ?? undefined,
current_industry: result.current_industry ?? undefined,
functional_area: result.functional_area ?? undefined,
linkedin_url: result.linkedin_url ?? undefined,
business_email: result.business_email ?? undefined,
personal_email: result.personal_email ?? undefined,
company: result.company ?? undefined,
},
}
},
outputs: RB2B_LINKEDIN_PROFILE_OUTPUT_PROPERTIES,
}
@@ -0,0 +1,75 @@
import type { Rb2bHashedEmailsResponse, Rb2bLinkedinParams } from '@/tools/rb2b/types'
import { RB2B_API_BASE, rb2bHeaders } from '@/tools/rb2b/utils'
import type { ToolConfig } from '@/tools/types'
export const rb2bLinkedinToHashedEmailsTool: ToolConfig<
Rb2bLinkedinParams,
Rb2bHashedEmailsResponse
> = {
id: 'rb2b_linkedin_to_hashed_emails',
name: 'RB2B LinkedIn to Hashed Emails',
description:
'Return the business and personal hashed emails (MD5 and SHA-256) associated with a LinkedIn profile.',
version: '1.0.0',
params: {
apiKey: {
type: 'string',
required: true,
visibility: 'user-only',
description: 'RB2B API key',
},
linkedin_slug: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'The LinkedIn profile slug or URL',
},
},
request: {
method: 'POST',
url: `${RB2B_API_BASE}/linkedin_to_hashed_emails`,
headers: (params) => rb2bHeaders(params.apiKey),
body: (params) => ({ linkedin_slug: params.linkedin_slug }),
},
transformResponse: async (response: Response) => {
const data = await response.json()
const results = data.results ?? {}
return {
success: true,
output: {
linkedin_slug: results.linkedin_slug ?? null,
business_md5_array: results.business_md5_array ?? [],
business_sha256_array: results.business_sha256_array ?? [],
personal_md5_array: results.personal_md5_array ?? [],
personal_sha256_array: results.personal_sha256_array ?? [],
},
}
},
outputs: {
linkedin_slug: { type: 'string', description: 'The LinkedIn slug', optional: true },
business_md5_array: {
type: 'array',
description: 'MD5 hashes of business emails',
items: { type: 'string' },
},
business_sha256_array: {
type: 'array',
description: 'SHA-256 hashes of business emails',
items: { type: 'string' },
},
personal_md5_array: {
type: 'array',
description: 'MD5 hashes of personal emails',
items: { type: 'string' },
},
personal_sha256_array: {
type: 'array',
description: 'SHA-256 hashes of personal emails',
items: { type: 'string' },
},
},
}
@@ -0,0 +1,54 @@
import type { Rb2bLinkedinParams, Rb2bMobilePhoneResponse } from '@/tools/rb2b/types'
import { RB2B_API_BASE, rb2bHeaders } from '@/tools/rb2b/utils'
import type { ToolConfig } from '@/tools/types'
export const rb2bLinkedinToMobilePhoneTool: ToolConfig<
Rb2bLinkedinParams,
Rb2bMobilePhoneResponse
> = {
id: 'rb2b_linkedin_to_mobile_phone',
name: 'RB2B LinkedIn to Mobile Phone',
description:
'Return the mobile phone number with the most recent known network activity for a LinkedIn profile.',
version: '1.0.0',
params: {
apiKey: {
type: 'string',
required: true,
visibility: 'user-only',
description: 'RB2B API key',
},
linkedin_slug: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'The LinkedIn profile slug or URL',
},
},
request: {
method: 'POST',
url: `${RB2B_API_BASE}/linkedin_to_mobile_phone`,
headers: (params) => rb2bHeaders(params.apiKey),
body: (params) => ({ linkedin_slug: params.linkedin_slug }),
},
transformResponse: async (response: Response) => {
const data = await response.json()
return {
success: true,
output: {
mobile_phone: data.result?.mobile_phone ?? null,
},
}
},
outputs: {
mobile_phone: {
type: 'string',
description: 'Mobile phone number for the LinkedIn profile',
optional: true,
},
},
}
@@ -0,0 +1,53 @@
import type { Rb2bLinkedinParams, Rb2bPersonalEmailsResponse } from '@/tools/rb2b/types'
import { RB2B_API_BASE, rb2bHeaders } from '@/tools/rb2b/utils'
import type { ToolConfig } from '@/tools/types'
export const rb2bLinkedinToPersonalEmailTool: ToolConfig<
Rb2bLinkedinParams,
Rb2bPersonalEmailsResponse
> = {
id: 'rb2b_linkedin_to_personal_email',
name: 'RB2B LinkedIn to Personal Email',
description: 'Return the personal email addresses associated with a LinkedIn profile.',
version: '1.0.0',
params: {
apiKey: {
type: 'string',
required: true,
visibility: 'user-only',
description: 'RB2B API key',
},
linkedin_slug: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'The LinkedIn profile slug or URL',
},
},
request: {
method: 'POST',
url: `${RB2B_API_BASE}/linkedin_to_personal_email`,
headers: (params) => rb2bHeaders(params.apiKey),
body: (params) => ({ linkedin_slug: params.linkedin_slug }),
},
transformResponse: async (response: Response) => {
const data = await response.json()
return {
success: true,
output: {
emails: data.result?.emails ?? [],
},
}
},
outputs: {
emails: {
type: 'array',
description: 'Personal email addresses for the LinkedIn profile',
items: { type: 'string' },
},
},
}
+325
View File
@@ -0,0 +1,325 @@
import type { OutputProperty, ToolResponse } from '@/tools/types'
/**
* Shared output property definitions for RB2B API responses.
* Based on the RB2B API collection: https://api.rb2b.com/api/v1
*/
/** A single hashed-email match returned by IP to HEM. */
export const RB2B_HEM_RESULT_OUTPUT_PROPERTIES = {
md5: { type: 'string', description: 'MD5 hash of the matched email' },
sha256: {
type: 'string',
description: 'SHA-256 hash of the matched email (only when include_sha256 is true)',
optional: true,
},
score: {
type: 'number',
description: 'Match accuracy score (0 = probabilistic, 1 = deterministic)',
},
} as const satisfies Record<string, OutputProperty>
/** A single mobile advertising identifier. */
export const RB2B_MAID_RESULT_OUTPUT_PROPERTIES = {
device_id: { type: 'string', description: 'The mobile advertising identifier' },
device_type: { type: 'string', description: 'The identifier type (e.g. AAID, IDFA)' },
} as const satisfies Record<string, OutputProperty>
/** A single company-domain match returned by IP to Company. */
export const RB2B_COMPANY_RESULT_OUTPUT_PROPERTIES = {
domain: { type: 'string', description: 'Company domain associated with the IP' },
percentage: { type: 'string', description: 'Confidence percentage for the match' },
} as const satisfies Record<string, OutputProperty>
/** A single email activity record. */
export const RB2B_ACTIVITY_RESULT_OUTPUT_PROPERTIES = {
email: { type: 'string', description: 'The email address' },
last_active: { type: 'string', description: 'Date the email was last seen active (YYYY-MM-DD)' },
} as const satisfies Record<string, OutputProperty>
/** Fields returned by HEM to Business Profile. */
export const RB2B_BUSINESS_PROFILE_OUTPUT_PROPERTIES = {
first_name: { type: 'string', description: 'First name', optional: true },
last_name: { type: 'string', description: 'Last name', optional: true },
title: { type: 'string', description: 'Job title', optional: true },
seniority: { type: 'string', description: 'Seniority level', optional: true },
linkedinurl: { type: 'string', description: 'Personal LinkedIn profile URL', optional: true },
link_email: { type: 'string', description: 'Linked business email address', optional: true },
work_email_confirmed: {
type: 'string',
description: 'Whether the work email is confirmed',
optional: true,
},
personal_emails: {
type: 'array',
description: 'Associated personal emails (hashed or plaintext depending on input)',
optional: true,
items: { type: 'string' },
},
current_company: { type: 'string', description: 'Current company name', optional: true },
current_company_url: { type: 'string', description: 'Current company website', optional: true },
current_company_linkedinurl: {
type: 'string',
description: 'Current company LinkedIn URL',
optional: true,
},
current_industry: { type: 'string', description: 'Current industry', optional: true },
functional_area: { type: 'string', description: 'Functional area', optional: true },
country: { type: 'string', description: 'Country', optional: true },
company_employee_count: {
type: 'string',
description: 'Company employee count',
optional: true,
},
company_employee_range: {
type: 'string',
description: 'Company employee range band',
optional: true,
},
company_revenue_range: {
type: 'string',
description: 'Company revenue range band',
optional: true,
},
md5: { type: 'string', description: 'MD5 hash of the resolved email', optional: true },
} as const satisfies Record<string, OutputProperty>
/** Company sub-object returned by LinkedIn to Business Profile. */
export const RB2B_LINKEDIN_COMPANY_OUTPUT_PROPERTIES = {
name: { type: 'string', description: 'Company name', optional: true },
industry: { type: 'string', description: 'Company industry', optional: true },
website_url: { type: 'string', description: 'Company website URL', optional: true },
linkedin_url: { type: 'string', description: 'Company LinkedIn URL', optional: true },
} as const satisfies Record<string, OutputProperty>
/** Fields returned by LinkedIn to Business Profile. */
export const RB2B_LINKEDIN_PROFILE_OUTPUT_PROPERTIES = {
first_name: { type: 'string', description: 'First name', optional: true },
last_name: { type: 'string', description: 'Last name', optional: true },
full_name: { type: 'string', description: 'Full name', optional: true },
headline: { type: 'string', description: 'LinkedIn headline', optional: true },
title: { type: 'string', description: 'Job title', optional: true },
seniority: { type: 'string', description: 'Seniority level', optional: true },
country: { type: 'string', description: 'Country', optional: true },
current_industry: { type: 'string', description: 'Current industry', optional: true },
functional_area: {
type: 'array',
description: 'Functional areas',
optional: true,
items: { type: 'string' },
},
linkedin_url: { type: 'string', description: 'Personal LinkedIn profile URL', optional: true },
business_email: { type: 'string', description: 'Business email address', optional: true },
personal_email: { type: 'string', description: 'Personal email address', optional: true },
company: {
type: 'object',
description: 'Current company details',
optional: true,
properties: RB2B_LINKEDIN_COMPANY_OUTPUT_PROPERTIES,
},
} as const satisfies Record<string, OutputProperty>
interface Rb2bMaidResult {
device_id: string
device_type: string
}
export interface Rb2bCreditCheckParams {
apiKey: string
}
export interface Rb2bCreditCheckResponse extends ToolResponse {
output: {
credits_remaining: number
}
}
export interface Rb2bIpToHemParams {
apiKey: string
ip_address: string
user_agent?: string
include_sha256?: boolean
}
export interface Rb2bIpToHemResponse extends ToolResponse {
output: {
results: Array<{
md5: string
sha256?: string
score: number
}>
}
}
export interface Rb2bIpToMaidParams {
apiKey: string
ip_address: string
user_agent?: string
}
export interface Rb2bIpToCompanyParams {
apiKey: string
ip_address: string
}
export interface Rb2bIpToCompanyResponse extends ToolResponse {
output: {
results: Array<{
domain: string
percentage: string
}>
}
}
/**
* Params for HEM (hashed email) endpoints. The `email` field accepts either a
* plaintext email address or an MD5 hash — the tool routes it to the correct
* request key automatically.
*/
export interface Rb2bIdentifierParams {
apiKey: string
email: string
}
export interface Rb2bMaidResponse extends ToolResponse {
output: {
results: Rb2bMaidResult[]
}
}
export interface Rb2bLinkedinUrlResponse extends ToolResponse {
output: {
linkedin_url: string | null
}
}
export interface Rb2bLinkedinSlugResponse extends ToolResponse {
output: {
linkedin_slug: string | null
}
}
export interface Rb2bBusinessProfileResponse extends ToolResponse {
output: {
first_name?: string
last_name?: string
title?: string
seniority?: string
linkedinurl?: string
link_email?: string
work_email_confirmed?: string
personal_emails?: string[]
current_company?: string
current_company_url?: string
current_company_linkedinurl?: string
current_industry?: string
functional_area?: string
country?: string
company_employee_count?: string
company_employee_range?: string
company_revenue_range?: string
md5?: string
}
}
export interface Rb2bEmailActivityParams {
apiKey: string
email: string
}
export interface Rb2bEmailActivityResponse extends ToolResponse {
output: {
results: Array<{
email: string
last_active: string
}>
match_count: number
credits_charged: number
credits_exhausted: boolean
}
}
export interface Rb2bLinkedinParams {
apiKey: string
linkedin_slug: string
}
export interface Rb2bBestPersonalEmailResponse extends ToolResponse {
output: {
email: string | null
}
}
export interface Rb2bPersonalEmailsResponse extends ToolResponse {
output: {
emails: string[]
}
}
export interface Rb2bHashedEmailsResponse extends ToolResponse {
output: {
linkedin_slug: string | null
business_md5_array: string[]
business_sha256_array: string[]
personal_md5_array: string[]
personal_sha256_array: string[]
}
}
export interface Rb2bMobilePhoneResponse extends ToolResponse {
output: {
mobile_phone: string | null
}
}
export interface Rb2bLinkedinProfileResponse extends ToolResponse {
output: {
first_name?: string
last_name?: string
full_name?: string
headline?: string
title?: string
seniority?: string
country?: string
current_industry?: string
functional_area?: string[]
linkedin_url?: string
business_email?: string
personal_email?: string
company?: {
name?: string
industry?: string
website_url?: string
linkedin_url?: string
}
}
}
export interface Rb2bLinkedinSlugSearchParams {
apiKey: string
first_name: string
last_name: string
company_domain: string
}
export interface Rb2bLinkedinSlugSearchResponse extends ToolResponse {
output: {
linkedin_url: string | null
}
}
export type Rb2bResponse =
| Rb2bCreditCheckResponse
| Rb2bIpToHemResponse
| Rb2bIpToCompanyResponse
| Rb2bMaidResponse
| Rb2bLinkedinUrlResponse
| Rb2bLinkedinSlugResponse
| Rb2bBusinessProfileResponse
| Rb2bEmailActivityResponse
| Rb2bBestPersonalEmailResponse
| Rb2bPersonalEmailsResponse
| Rb2bHashedEmailsResponse
| Rb2bMobilePhoneResponse
| Rb2bLinkedinProfileResponse
| Rb2bLinkedinSlugSearchResponse
+18
View File
@@ -0,0 +1,18 @@
/** Base URL for all RB2B API v1 endpoints. */
export const RB2B_API_BASE = 'https://api.rb2b.com/api/v1'
/** Standard headers for RB2B requests. Auth is an `Api-Key` header. */
export function rb2bHeaders(apiKey: string): Record<string, string> {
return {
'Content-Type': 'application/json',
'Api-Key': apiKey,
}
}
/**
* HEM endpoints accept either a plaintext email or an MD5 hash under the
* `email` / `md5` body key respectively. Route the value to the correct key.
*/
export function buildIdentifierBody(value: string): Record<string, string> {
return value.includes('@') ? { email: value } : { md5: value }
}
+32
View File
@@ -2170,6 +2170,23 @@ import {
railwayUpdateProjectTool,
railwayUpsertVariableTool,
} from '@/tools/railway'
import {
rb2bCreditCheckTool,
rb2bEmailToActivityTool,
rb2bHemToBestLinkedinTool,
rb2bHemToBusinessProfileTool,
rb2bHemToLinkedinTool,
rb2bHemToMaidTool,
rb2bIpToCompanyTool,
rb2bIpToHemTool,
rb2bIpToMaidTool,
rb2bLinkedinSlugSearchTool,
rb2bLinkedinToBestPersonalEmailTool,
rb2bLinkedinToBusinessProfileTool,
rb2bLinkedinToHashedEmailsTool,
rb2bLinkedinToMobilePhoneTool,
rb2bLinkedinToPersonalEmailTool,
} from '@/tools/rb2b'
import {
rdsDeleteTool,
rdsExecuteTool,
@@ -4356,6 +4373,21 @@ export const tools: Record<string, ToolConfig> = {
parallel_search: parallelSearchTool,
parallel_extract: parallelExtractTool,
parallel_deep_research: parallelDeepResearchTool,
rb2b_credit_check: rb2bCreditCheckTool,
rb2b_ip_to_hem: rb2bIpToHemTool,
rb2b_ip_to_maid: rb2bIpToMaidTool,
rb2b_ip_to_company: rb2bIpToCompanyTool,
rb2b_hem_to_business_profile: rb2bHemToBusinessProfileTool,
rb2b_hem_to_best_linkedin: rb2bHemToBestLinkedinTool,
rb2b_hem_to_linkedin: rb2bHemToLinkedinTool,
rb2b_hem_to_maid: rb2bHemToMaidTool,
rb2b_email_to_activity: rb2bEmailToActivityTool,
rb2b_linkedin_to_business_profile: rb2bLinkedinToBusinessProfileTool,
rb2b_linkedin_to_best_personal_email: rb2bLinkedinToBestPersonalEmailTool,
rb2b_linkedin_to_personal_email: rb2bLinkedinToPersonalEmailTool,
rb2b_linkedin_to_hashed_emails: rb2bLinkedinToHashedEmailsTool,
rb2b_linkedin_to_mobile_phone: rb2bLinkedinToMobilePhoneTool,
rb2b_linkedin_slug_search: rb2bLinkedinSlugSearchTool,
reddit_hot_posts: redditHotPostsTool,
reddit_get_posts: redditGetPostsTool,
reddit_get_comments: redditGetCommentsTool,