Skip to content

Commit 9ddd15d

Browse files
committed
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
1 parent 63e2f1c commit 9ddd15d

28 files changed

Lines changed: 2416 additions & 0 deletions

apps/docs/components/icons.tsx

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1574,6 +1574,46 @@ export function ExaAIIcon(props: SVGProps<SVGSVGElement>) {
15741574
)
15751575
}
15761576

1577+
export function RB2BIcon(props: SVGProps<SVGSVGElement>) {
1578+
return (
1579+
<svg viewBox='0 0 165 48' fill='none' xmlns='http://www.w3.org/2000/svg' {...props}>
1580+
<g clipPath='url(#clip0_551_23712)'>
1581+
<path d='M95.975 8.40234H87.5703V16.8057H95.975V8.40234Z' fill='#0C1316' />
1582+
<path d='M121.405 8.40234H113V16.8057H121.405V8.40234Z' fill='#0C1316' />
1583+
<path d='M112.998 16.8066H104.594V25.21H112.998V16.8066Z' fill='#0C1316' />
1584+
<path d='M104.596 25.2109H96.1914V33.6143H104.596V25.2109Z' fill='#0C1316' />
1585+
<path
1586+
d='M87.7852 39.5965V42.0166V47.9998H121.404V39.5965H96.1898V33.6133H87.7852V39.5965Z'
1587+
fill='#0C1316'
1588+
/>
1589+
<path d='M112.786 0H95.9766V8.40336H112.786V0Z' fill='#0C1316' />
1590+
<path
1591+
d='M52.3773 8.40336H74.3639V0H52.3773H43.9727V48H52.3773H74.3639V39.5966H52.3773V28.2017H74.3639V19.7983H52.3773V8.40336Z'
1592+
fill='#0C1316'
1593+
/>
1594+
<path d='M82.7718 8.40234H74.3672V19.7973H82.7718V8.40234Z' fill='#0C1316' />
1595+
<path d='M82.7679 28.2031H74.3633V39.5981H82.7679V28.2031Z' fill='#0C1316' />
1596+
<path d='M164.998 8.40234H156.594V19.7973H164.998V8.40234Z' fill='#0C1316' />
1597+
<path d='M164.998 28.2031H156.594V39.5981H164.998V28.2031Z' fill='#0C1316' />
1598+
<path
1599+
d='M134.608 19.7983V8.40336H156.594V0H134.608H126.203V48H134.608H156.594V39.5966H134.608V28.2017H156.594V19.7983H134.608Z'
1600+
fill='#0C1316'
1601+
/>
1602+
<path
1603+
d='M8.40464 8.40336H30.3912V0H8.40464H0V48H8.40464V28.2017H21.9866V36.605H30.3912V48H38.7958V28.2017H30.3912V19.7983H8.40464V8.40336Z'
1604+
fill='#0C1316'
1605+
/>
1606+
<path d='M38.7953 8.40234H30.3906V19.7973H38.7953V8.40234Z' fill='#0C1316' />
1607+
</g>
1608+
<defs>
1609+
<clipPath id='clip0_551_23712'>
1610+
<rect width='165' height='48' fill='white' />
1611+
</clipPath>
1612+
</defs>
1613+
</svg>
1614+
)
1615+
}
1616+
15771617
export function RedditIcon(props: SVGProps<SVGSVGElement>) {
15781618
return (
15791619
<svg

apps/docs/components/ui/icon-mapping.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ import {
152152
QdrantIcon,
153153
QuiverIcon,
154154
RailwayIcon,
155+
RB2BIcon,
155156
RDSIcon,
156157
RedditIcon,
157158
RedisIcon,
@@ -382,6 +383,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
382383
qdrant: QdrantIcon,
383384
quiver: QuiverIcon,
384385
railway: RailwayIcon,
386+
rb2b: RB2BIcon,
385387
rds: RDSIcon,
386388
reddit: RedditIcon,
387389
redis: RedisIcon,

apps/docs/content/docs/en/tools/meta.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@
148148
"qdrant",
149149
"quiver",
150150
"railway",
151+
"rb2b",
151152
"rds",
152153
"reddit",
153154
"redis",

apps/docs/content/docs/en/tools/rb2b.mdx

Lines changed: 756 additions & 0 deletions
Large diffs are not rendered by default.

apps/sim/app/(landing)/integrations/data/icon-mapping.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ import {
151151
QdrantIcon,
152152
QuiverIcon,
153153
RailwayIcon,
154+
RB2BIcon,
154155
RDSIcon,
155156
RedditIcon,
156157
RedisIcon,
@@ -360,6 +361,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
360361
qdrant: QdrantIcon,
361362
quiver: QuiverIcon,
362363
railway: RailwayIcon,
364+
rb2b: RB2BIcon,
363365
rds: RDSIcon,
364366
reddit: RedditIcon,
365367
redis: RedisIcon,

apps/sim/app/(landing)/integrations/data/integrations.json

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11000,6 +11000,85 @@
1100011000
"integrationTypes": ["developer-tools"],
1100111001
"tags": ["cloud", "ci-cd"]
1100211002
},
11003+
{
11004+
"type": "rb2b",
11005+
"slug": "rb2b",
11006+
"name": "RB2B",
11007+
"description": "Identify and enrich website visitors",
11008+
"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.",
11009+
"bgColor": "#51FF00",
11010+
"iconName": "RB2BIcon",
11011+
"docsUrl": "https://docs.sim.ai/tools/rb2b",
11012+
"operations": [
11013+
{
11014+
"name": "Credit Check",
11015+
"description": "Check the number of API credits remaining on your RB2B account."
11016+
},
11017+
{
11018+
"name": "IP to HEM",
11019+
"description": "Convert an IP address (and optional user agent) into hashed email addresses (HEM) with accuracy scores."
11020+
},
11021+
{
11022+
"name": "IP to MAID",
11023+
"description": "Resolve an IP address (and optional user agent) into mobile advertising identifiers (MAIDs) observed over the last 60 days."
11024+
},
11025+
{
11026+
"name": "IP to Company",
11027+
"description": "Identify the company domains associated with an IP address, ranked by confidence."
11028+
},
11029+
{
11030+
"name": "Email/HEM to Business Profile",
11031+
"description": "Return a full business profile (name, title, company, industry, seniority and more) for an email address or MD5-hashed email."
11032+
},
11033+
{
11034+
"name": "Email/HEM to Best LinkedIn URL",
11035+
"description": "Return the most recently active LinkedIn profile URL for an email address or MD5-hashed email."
11036+
},
11037+
{
11038+
"name": "Email/HEM to LinkedIn Slug",
11039+
"description": "Return the LinkedIn slug (the profile identifier portion of the URL) for an email address or MD5-hashed email."
11040+
},
11041+
{
11042+
"name": "Email/HEM to MAID",
11043+
"description": "Return up to five mobile advertising identifiers (MAIDs) associated with an email address or MD5-hashed email."
11044+
},
11045+
{
11046+
"name": "Email to Last Active Date",
11047+
"description": "Return the last known active date for an email address."
11048+
},
11049+
{
11050+
"name": "LinkedIn to Business Profile",
11051+
"description": "Return a full business profile (name, title, company, emails and more) for a LinkedIn profile."
11052+
},
11053+
{
11054+
"name": "LinkedIn to Best Personal Email",
11055+
"description": "Return the personal email with the most recent known network activity for a LinkedIn profile."
11056+
},
11057+
{
11058+
"name": "LinkedIn to Personal Email",
11059+
"description": "Return the personal email addresses associated with a LinkedIn profile."
11060+
},
11061+
{
11062+
"name": "LinkedIn to Hashed Emails",
11063+
"description": "Return the business and personal hashed emails (MD5 and SHA-256) associated with a LinkedIn profile."
11064+
},
11065+
{
11066+
"name": "LinkedIn to Mobile Phone",
11067+
"description": "Return the mobile phone number with the most recent known network activity for a LinkedIn profile."
11068+
},
11069+
{
11070+
"name": "LinkedIn Slug Search",
11071+
"description": "Find a LinkedIn profile URL from a first name, last name, and company domain."
11072+
}
11073+
],
11074+
"operationCount": 15,
11075+
"triggers": [],
11076+
"triggerCount": 0,
11077+
"authType": "api-key",
11078+
"category": "tools",
11079+
"integrationTypes": ["sales", "security"],
11080+
"tags": ["enrichment", "identity", "sales-engagement"]
11081+
},
1100311082
{
1100411083
"type": "reddit",
1100511084
"slug": "reddit",

apps/sim/blocks/blocks/rb2b.ts

Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
1+
import { RB2BIcon } from '@/components/icons'
2+
import type { BlockConfig } from '@/blocks/types'
3+
import { AuthMode, IntegrationType } from '@/blocks/types'
4+
import type { Rb2bResponse } from '@/tools/rb2b/types'
5+
6+
const EMAIL_OPERATIONS = [
7+
'hem_to_business_profile',
8+
'hem_to_best_linkedin',
9+
'hem_to_linkedin',
10+
'hem_to_maid',
11+
'email_to_activity',
12+
]
13+
14+
const LINKEDIN_OPERATIONS = [
15+
'linkedin_to_business_profile',
16+
'linkedin_to_best_personal_email',
17+
'linkedin_to_personal_email',
18+
'linkedin_to_hashed_emails',
19+
'linkedin_to_mobile_phone',
20+
]
21+
22+
const IP_OPERATIONS = ['ip_to_hem', 'ip_to_maid', 'ip_to_company']
23+
24+
export const RB2BBlock: BlockConfig<Rb2bResponse> = {
25+
type: 'rb2b',
26+
name: 'RB2B',
27+
description: 'Identify and enrich website visitors',
28+
authMode: AuthMode.ApiKey,
29+
longDescription:
30+
'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.',
31+
category: 'tools',
32+
integrationType: IntegrationType.Sales,
33+
tags: ['enrichment', 'identity', 'sales-engagement'],
34+
docsLink: 'https://docs.sim.ai/tools/rb2b',
35+
bgColor: '#51FF00',
36+
icon: RB2BIcon,
37+
subBlocks: [
38+
{
39+
id: 'operation',
40+
title: 'Operation',
41+
type: 'dropdown',
42+
options: [
43+
{ label: 'Credit Check', id: 'credit_check' },
44+
{ label: 'IP to HEM', id: 'ip_to_hem' },
45+
{ label: 'IP to MAID', id: 'ip_to_maid' },
46+
{ label: 'IP to Company', id: 'ip_to_company' },
47+
{ label: 'Email/HEM to Business Profile', id: 'hem_to_business_profile' },
48+
{ label: 'Email/HEM to Best LinkedIn URL', id: 'hem_to_best_linkedin' },
49+
{ label: 'Email/HEM to LinkedIn Slug', id: 'hem_to_linkedin' },
50+
{ label: 'Email/HEM to MAID', id: 'hem_to_maid' },
51+
{ label: 'Email to Last Active Date', id: 'email_to_activity' },
52+
{ label: 'LinkedIn to Business Profile', id: 'linkedin_to_business_profile' },
53+
{ label: 'LinkedIn to Best Personal Email', id: 'linkedin_to_best_personal_email' },
54+
{ label: 'LinkedIn to Personal Email', id: 'linkedin_to_personal_email' },
55+
{ label: 'LinkedIn to Hashed Emails', id: 'linkedin_to_hashed_emails' },
56+
{ label: 'LinkedIn to Mobile Phone', id: 'linkedin_to_mobile_phone' },
57+
{ label: 'LinkedIn Slug Search', id: 'linkedin_slug_search' },
58+
],
59+
value: () => 'ip_to_hem',
60+
},
61+
{
62+
id: 'ip_address',
63+
title: 'IP Address',
64+
type: 'short-input',
65+
placeholder: 'e.g. 162.192.6.240',
66+
condition: { field: 'operation', value: IP_OPERATIONS },
67+
required: { field: 'operation', value: IP_OPERATIONS },
68+
},
69+
{
70+
id: 'user_agent',
71+
title: 'User Agent',
72+
type: 'short-input',
73+
placeholder: 'Optional user agent string',
74+
condition: { field: 'operation', value: ['ip_to_hem', 'ip_to_maid'] },
75+
},
76+
{
77+
id: 'include_sha256',
78+
title: 'Include SHA-256 Hashes',
79+
type: 'switch',
80+
condition: { field: 'operation', value: 'ip_to_hem' },
81+
},
82+
{
83+
id: 'email',
84+
title: 'Email or MD5 Hash',
85+
type: 'short-input',
86+
placeholder: 'jane@example.com or an MD5 hash',
87+
condition: { field: 'operation', value: EMAIL_OPERATIONS },
88+
required: { field: 'operation', value: EMAIL_OPERATIONS },
89+
},
90+
{
91+
id: 'linkedin_slug',
92+
title: 'LinkedIn Slug or URL',
93+
type: 'short-input',
94+
placeholder: 'e.g. firstname-lastname or full profile URL',
95+
condition: { field: 'operation', value: LINKEDIN_OPERATIONS },
96+
required: { field: 'operation', value: LINKEDIN_OPERATIONS },
97+
},
98+
{
99+
id: 'first_name',
100+
title: 'First Name',
101+
type: 'short-input',
102+
placeholder: 'Jane',
103+
condition: { field: 'operation', value: 'linkedin_slug_search' },
104+
required: { field: 'operation', value: 'linkedin_slug_search' },
105+
},
106+
{
107+
id: 'last_name',
108+
title: 'Last Name',
109+
type: 'short-input',
110+
placeholder: 'Doe',
111+
condition: { field: 'operation', value: 'linkedin_slug_search' },
112+
required: { field: 'operation', value: 'linkedin_slug_search' },
113+
},
114+
{
115+
id: 'company_domain',
116+
title: 'Company Domain',
117+
type: 'short-input',
118+
placeholder: 'example.com',
119+
condition: { field: 'operation', value: 'linkedin_slug_search' },
120+
required: { field: 'operation', value: 'linkedin_slug_search' },
121+
},
122+
{
123+
id: 'apiKey',
124+
title: 'API Key',
125+
type: 'short-input',
126+
placeholder: 'Enter your RB2B API key',
127+
password: true,
128+
required: true,
129+
},
130+
],
131+
tools: {
132+
access: [
133+
'rb2b_credit_check',
134+
'rb2b_ip_to_hem',
135+
'rb2b_ip_to_maid',
136+
'rb2b_ip_to_company',
137+
'rb2b_hem_to_business_profile',
138+
'rb2b_hem_to_best_linkedin',
139+
'rb2b_hem_to_linkedin',
140+
'rb2b_hem_to_maid',
141+
'rb2b_email_to_activity',
142+
'rb2b_linkedin_to_business_profile',
143+
'rb2b_linkedin_to_best_personal_email',
144+
'rb2b_linkedin_to_personal_email',
145+
'rb2b_linkedin_to_hashed_emails',
146+
'rb2b_linkedin_to_mobile_phone',
147+
'rb2b_linkedin_slug_search',
148+
],
149+
config: {
150+
tool: (params) => `rb2b_${params.operation}`,
151+
},
152+
},
153+
inputs: {
154+
operation: { type: 'string', description: 'Operation to perform' },
155+
apiKey: { type: 'string', description: 'RB2B API key' },
156+
ip_address: { type: 'string', description: 'IP address to resolve' },
157+
user_agent: { type: 'string', description: 'Optional user agent string' },
158+
include_sha256: { type: 'boolean', description: 'Include SHA-256 hashes (IP to HEM)' },
159+
email: { type: 'string', description: 'Email address or MD5 hash of the email' },
160+
linkedin_slug: { type: 'string', description: 'LinkedIn profile slug or URL' },
161+
first_name: { type: 'string', description: 'First name (LinkedIn Slug Search)' },
162+
last_name: { type: 'string', description: 'Last name (LinkedIn Slug Search)' },
163+
company_domain: { type: 'string', description: 'Company domain (LinkedIn Slug Search)' },
164+
},
165+
outputs: {
166+
credits_remaining: { type: 'number', description: 'API credits remaining (Credit Check)' },
167+
results: {
168+
type: 'json',
169+
description: 'Result list for IP/MAID/company/activity lookups',
170+
},
171+
match_count: { type: 'number', description: 'Number of matches (Email to Last Active Date)' },
172+
credits_charged: { type: 'number', description: 'Credits charged for the request' },
173+
credits_exhausted: { type: 'boolean', description: 'Whether the account is out of credits' },
174+
linkedin_url: { type: 'string', description: 'LinkedIn profile URL' },
175+
linkedin_slug: { type: 'string', description: 'LinkedIn slug' },
176+
email: { type: 'string', description: 'Best personal email' },
177+
emails: { type: 'array', description: 'Personal email addresses' },
178+
mobile_phone: { type: 'string', description: 'Mobile phone number' },
179+
business_md5_array: { type: 'array', description: 'MD5 hashes of business emails' },
180+
business_sha256_array: { type: 'array', description: 'SHA-256 hashes of business emails' },
181+
personal_md5_array: { type: 'array', description: 'MD5 hashes of personal emails' },
182+
personal_sha256_array: { type: 'array', description: 'SHA-256 hashes of personal emails' },
183+
first_name: { type: 'string', description: 'First name (business profile)' },
184+
last_name: { type: 'string', description: 'Last name (business profile)' },
185+
full_name: { type: 'string', description: 'Full name (LinkedIn business profile)' },
186+
headline: { type: 'string', description: 'LinkedIn headline' },
187+
title: { type: 'string', description: 'Job title' },
188+
seniority: { type: 'string', description: 'Seniority level' },
189+
country: { type: 'string', description: 'Country' },
190+
current_industry: { type: 'string', description: 'Current industry' },
191+
functional_area: { type: 'json', description: 'Functional area(s)' },
192+
current_company: { type: 'string', description: 'Current company name' },
193+
current_company_url: { type: 'string', description: 'Current company website' },
194+
current_company_linkedinurl: { type: 'string', description: 'Current company LinkedIn URL' },
195+
company: { type: 'json', description: 'Company details (LinkedIn business profile)' },
196+
business_email: { type: 'string', description: 'Business email address' },
197+
personal_email: { type: 'string', description: 'Personal email address' },
198+
personal_emails: { type: 'array', description: 'Personal emails (business profile)' },
199+
linkedinurl: { type: 'string', description: 'LinkedIn profile URL (business profile)' },
200+
link_email: { type: 'string', description: 'Linked business email (business profile)' },
201+
work_email_confirmed: { type: 'string', description: 'Whether the work email is confirmed' },
202+
company_employee_count: { type: 'string', description: 'Company employee count' },
203+
company_employee_range: { type: 'string', description: 'Company employee range band' },
204+
company_revenue_range: { type: 'string', description: 'Company revenue range band' },
205+
md5: { type: 'string', description: 'MD5 hash of the resolved email' },
206+
},
207+
}

apps/sim/blocks/registry.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ import { PulseBlock, PulseV2Block } from '@/blocks/blocks/pulse'
165165
import { QdrantBlock } from '@/blocks/blocks/qdrant'
166166
import { QuiverBlock } from '@/blocks/blocks/quiver'
167167
import { RailwayBlock } from '@/blocks/blocks/railway'
168+
import { RB2BBlock } from '@/blocks/blocks/rb2b'
168169
import { RDSBlock } from '@/blocks/blocks/rds'
169170
import { RedditBlock } from '@/blocks/blocks/reddit'
170171
import { RedisBlock } from '@/blocks/blocks/redis'
@@ -432,6 +433,7 @@ export const registry: Record<string, BlockConfig> = {
432433
qdrant: QdrantBlock,
433434
quiver: QuiverBlock,
434435
railway: RailwayBlock,
436+
rb2b: RB2BBlock,
435437
rds: RDSBlock,
436438
reddit: RedditBlock,
437439
redis: RedisBlock,

0 commit comments

Comments
 (0)