Skip to content

Commit f907a81

Browse files
Bill LeoutsakosBill Leoutsakos
authored andcommitted
feat(harmonic): add contact workflow integration
1 parent a99f61b commit f907a81

22 files changed

Lines changed: 2270 additions & 3 deletions

File tree

apps/docs/components/icons.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,28 @@ export function ChartBarIcon(props: SVGProps<SVGSVGElement>) {
563563
)
564564
}
565565

566+
export function HarmonicIcon(props: SVGProps<SVGSVGElement>) {
567+
return (
568+
<svg {...props} viewBox='0 1 26 30.1' fill='none' role='img' xmlns='http://www.w3.org/2000/svg'>
569+
{/** svg-path-precision-exception: Preserves Harmonic's supplied brand-mark coordinates. */}
570+
<path
571+
d='M6.49743 1.08252L12.9949 4.83381V12.3364L6.49743 16.0877L0 12.3364V4.83381L6.49743 1.08252Z'
572+
fill='#FE5D45'
573+
/>
574+
{/** svg-path-precision-exception: Preserves Harmonic's supplied brand-mark coordinates. */}
575+
<path
576+
d='M6.49743 16.0874L12.9949 19.8387V27.3413L6.49743 31.0926L0 27.3413V19.8387L6.49743 16.0874Z'
577+
fill='#FE5D45'
578+
/>
579+
{/** svg-path-precision-exception: Preserves Harmonic's supplied brand-mark coordinates. */}
580+
<path
581+
d='M19.5026 8.58496L26 12.3363V19.8388L19.5026 23.5901L13.0051 19.8388V12.3363L19.5026 8.58496Z'
582+
fill='#FE5D45'
583+
/>
584+
</svg>
585+
)
586+
}
587+
566588
export function HubspotIcon(props: SVGProps<SVGSVGElement>) {
567589
return (
568590
<svg

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ import {
112112
GranolaIcon,
113113
GreenhouseIcon,
114114
GreptileIcon,
115+
HarmonicIcon,
115116
HexIcon,
116117
HubspotIcon,
117118
HuggingFaceIcon,
@@ -393,6 +394,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
393394
granola: GranolaIcon,
394395
greenhouse: GreenhouseIcon,
395396
greptile: GreptileIcon,
397+
harmonic: HarmonicIcon,
396398
hex: HexIcon,
397399
hubspot: HubspotIcon,
398400
huggingface: HuggingFaceIcon,
Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
---
2+
title: Harmonic
3+
description: Search and enrich private-market contacts
4+
---
5+
6+
import { BlockInfoCard } from "@/components/ui/block-info-card"
7+
8+
<BlockInfoCard
9+
type="harmonic"
10+
color="#FFFFFF"
11+
/>
12+
13+
{/* MANUAL-CONTENT-START:intro */}
14+
[Harmonic](https://harmonic.ai/) is a private-market intelligence platform for researching companies, people, and investors. Its Scout agent accepts a natural-language sourcing request—such as “find forward-deployed engineers in enterprise software”—and the Harmonic block converts the result into a predictable `contacts` table for downstream scoring, review, storage in Sim tables, or delivery to CRM and other integration blocks.
15+
16+
### Authentication
17+
18+
This integration uses a Harmonic **team API key**, sent only in the `apikey` request header. It does not use OAuth. You need an existing Harmonic workspace with API access; ask your Harmonic workspace administrator or [Harmonic support](mailto:support@harmonic.ai) for the team key, then paste it into the block's **Harmonic API Key** field.
19+
20+
### Working with people data
21+
22+
- **Scout search:** **Search People with Scout** uses an integration-owned schema so every successful request returns the same normalized contact fields. Scout task errors, timeouts, interruptions, and malformed structured results stop the workflow instead of returning an ambiguous partial result.
23+
- **Saved searches:** A team API key can read only saved searches shared with the team. Make a private people search shared in the Harmonic console before retrieving it through the API. Follow `pageInfo.nextCursor` while `pageInfo.hasNext` is true.
24+
- **URN-only rows:** Saved-search pages may contain person URNs without full profiles. Pass `personUrns` to **Batch Get People** to hydrate them into the common contact shape.
25+
- **Downstream workflows:** Pass `contacts` directly into Sim tables, scoring or approval steps, and other integrations such as a CRM. Every contact-producing action uses the same camelCase output shape.
26+
- **Workspace and list APIs:** This first version intentionally omits Harmonic's retiring V1 workspace and people-list endpoints. Harmonic says those APIs stop serving traffic on November 5, 2026 and already fail after a workspace completes its V2 migration. See Harmonic's [Workspace API migration guide](https://console.harmonic.ai/docs/api-reference/workspace/migration) for the V2 GraphQL replacement.
27+
28+
Harmonic recommends no more than 100 saved-search results per page. Its general API limit is 10 requests per second, while Scout task creation is limited to 10 requests per minute and 100 per hour. Endpoint and field availability can also depend on your Harmonic subscription.
29+
30+
Harmonic does not publish a webhook-registration contract for this workflow surface, so the integration has no native triggers. Use a **Schedule** block to poll a shared saved search when recurring synchronization is needed.
31+
{/* MANUAL-CONTENT-END */}
32+
33+
34+
## Usage Instructions
35+
36+
Use Harmonic Scout to find people with natural-language criteria, retrieve team-visible people saved searches, and hydrate person identifiers into normalized contacts for downstream tables, CRM, scoring, and outreach workflows.
37+
38+
39+
40+
## Actions
41+
42+
### Harmonic Search People with Scout
43+
44+
Ask Harmonic Scout to find people using natural language and return a stable, workflow-ready contacts table.
45+
46+
#### Input
47+
48+
| Parameter | Type | Required | Description |
49+
| --------- | ---- | -------- | ----------- |
50+
| `apiKey` | string | Yes | Harmonic team API key, sent in the apikey header |
51+
| `query` | string | Yes | Natural-language people research request, e.g. "Find forward-deployed engineers in enterprise software" |
52+
53+
#### Output
54+
55+
| Parameter | Type | Description |
56+
| --------- | ---- | ----------- |
57+
| `contacts` | array | People matching the Scout request, normalized for downstream workflow use |
58+
|`personUrn` | string | Harmonic person URN |
59+
|`personId` | number | Numeric Harmonic person ID |
60+
|`fullName` | string | Full name |
61+
|`firstName` | string | First name |
62+
|`lastName` | string | Last name |
63+
|`headline` | string | LinkedIn headline or current title |
64+
|`currentTitles` | array | Current job titles |
65+
|`currentCompanyNames` | array | Current company names |
66+
|`currentCompanyUrns` | array | Current Harmonic company URNs |
67+
|`primaryEmail` | string | Primary known email address |
68+
|`emails` | array | Known email addresses |
69+
|`phoneNumbers` | array | Known phone numbers |
70+
|`linkedinUrl` | string | LinkedIn profile URL |
71+
|`formattedLocation` | string | Formatted location |
72+
|`city` | string | City |
73+
|`state` | string | State or region |
74+
|`country` | string | Country |
75+
|`profilePictureUrl` | string | Profile picture URL |
76+
|`summary` | string | Scout-generated contact summary |
77+
|`isRedacted` | boolean | Whether Harmonic marks the person record as redacted |
78+
| `taskId` | string | Harmonic Scout task identifier |
79+
| `status` | string | Final Scout task status \(success\) |
80+
| `count` | number | Number of contacts returned |
81+
82+
### Harmonic List People Saved Searches
83+
84+
List the team-shared Harmonic saved searches that target people. Use a returned ID or URN to fetch results.
85+
86+
#### Input
87+
88+
| Parameter | Type | Required | Description |
89+
| --------- | ---- | -------- | ----------- |
90+
| `apiKey` | string | Yes | Harmonic team API key, sent in the apikey header |
91+
92+
#### Output
93+
94+
| Parameter | Type | Description |
95+
| --------- | ---- | ----------- |
96+
| `savedSearches` | array | Team-accessible Harmonic saved searches that target people |
97+
|`savedSearchId` | number | Saved search ID |
98+
|`savedSearchUrn` | string | Saved search URN |
99+
|`name` | string | Saved search name |
100+
|`isPrivate` | boolean | Whether the search is private |
101+
|`savedSearchType` | string | Saved search entity type |
102+
|`userSavedSearchType` | string | User-facing saved search type |
103+
|`creatorUrn` | string | Creator user URN |
104+
|`createdAt` | string | Creation timestamp |
105+
|`updatedAt` | string | Last update timestamp |
106+
| `count` | number | Number of people saved searches returned |
107+
108+
### Harmonic Get People Saved Search Results
109+
110+
Get one page of a Harmonic people saved search. Full records become contacts; URN-only rows are exposed for Batch Get People.
111+
112+
#### Input
113+
114+
| Parameter | Type | Required | Description |
115+
| --------- | ---- | -------- | ----------- |
116+
| `apiKey` | string | Yes | Harmonic team API key, sent in the apikey header |
117+
| `savedSearchId` | string | Yes | People saved-search ID or full Harmonic saved-search URN |
118+
| `size` | number | No | Results to return, 1-100 \(default 50\) |
119+
| `cursor` | string | No | Opaque next-page cursor from a previous response |
120+
121+
#### Output
122+
123+
| Parameter | Type | Description |
124+
| --------- | ---- | ----------- |
125+
| `contacts` | array | Full person records returned by the saved search, normalized as contacts |
126+
|`personUrn` | string | Harmonic person URN |
127+
|`personId` | number | Numeric Harmonic person ID |
128+
|`fullName` | string | Full name |
129+
|`firstName` | string | First name |
130+
|`lastName` | string | Last name |
131+
|`headline` | string | LinkedIn headline or current title |
132+
|`currentTitles` | array | Current job titles |
133+
|`currentCompanyNames` | array | Current company names |
134+
|`currentCompanyUrns` | array | Current Harmonic company URNs |
135+
|`primaryEmail` | string | Primary known email address |
136+
|`emails` | array | Known email addresses |
137+
|`phoneNumbers` | array | Known phone numbers |
138+
|`linkedinUrl` | string | LinkedIn profile URL |
139+
|`formattedLocation` | string | Formatted location |
140+
|`city` | string | City |
141+
|`state` | string | State or region |
142+
|`country` | string | Country |
143+
|`profilePictureUrl` | string | Profile picture URL |
144+
|`summary` | string | Scout-generated contact summary |
145+
|`isRedacted` | boolean | Whether Harmonic marks the person record as redacted |
146+
| `personUrns` | array | All person URNs in the page, including rows returned without full profiles |
147+
| `totalCount` | number | Total matching people |
148+
| `pageInfo` | object | Cursor pagination metadata |
149+
|`nextCursor` | string | Cursor for the next page |
150+
|`currentCursor` | string | Cursor for the current page |
151+
|`hasNext` | boolean | Whether another page is available |
152+
153+
### Harmonic Batch Get People
154+
155+
Fetch full Harmonic person profiles for up to 500 combined numeric IDs and person URNs.
156+
157+
#### Input
158+
159+
| Parameter | Type | Required | Description |
160+
| --------- | ---- | -------- | ----------- |
161+
| `apiKey` | string | Yes | Harmonic team API key, sent in the apikey header |
162+
| `personIds` | json | No | Array of numeric Harmonic person IDs; may be a JSON-array string |
163+
| `personUrns` | json | No | Array of Harmonic person URNs; may be a JSON-array string |
164+
165+
#### Output
166+
167+
| Parameter | Type | Description |
168+
| --------- | ---- | ----------- |
169+
| `contacts` | array | Fetched Harmonic person profiles normalized as contacts |
170+
|`personUrn` | string | Harmonic person URN |
171+
|`personId` | number | Numeric Harmonic person ID |
172+
|`fullName` | string | Full name |
173+
|`firstName` | string | First name |
174+
|`lastName` | string | Last name |
175+
|`headline` | string | LinkedIn headline or current title |
176+
|`currentTitles` | array | Current job titles |
177+
|`currentCompanyNames` | array | Current company names |
178+
|`currentCompanyUrns` | array | Current Harmonic company URNs |
179+
|`primaryEmail` | string | Primary known email address |
180+
|`emails` | array | Known email addresses |
181+
|`phoneNumbers` | array | Known phone numbers |
182+
|`linkedinUrl` | string | LinkedIn profile URL |
183+
|`formattedLocation` | string | Formatted location |
184+
|`city` | string | City |
185+
|`state` | string | State or region |
186+
|`country` | string | Country |
187+
|`profilePictureUrl` | string | Profile picture URL |
188+
|`summary` | string | Scout-generated contact summary |
189+
|`isRedacted` | boolean | Whether Harmonic marks the person record as redacted |
190+
| `count` | number | Number of contacts returned |
191+
192+

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@
114114
"granola",
115115
"greenhouse",
116116
"greptile",
117+
"harmonic",
117118
"hex",
118119
"hubspot",
119120
"hubspot-service-account",

0 commit comments

Comments
 (0)