Skip to content
Open
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions components/super_carl/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Overview

Super Carl is an AI networking and relationship-search platform for finding people, companies, jobs, posts, warm paths, and approved outbound communications through a user's professional network.

Use Super Carl on Pipedream to build workflows that qualify people and companies, check network readiness before search, find jobs with warm paths, discover post or engagement signals, and create drafts or sends through Super Carl communication channels.

# Getting Started

Super Carl uses API-key authentication. In Super Carl, open **Integrations**, go to the **API / MCP** section, and create or purchase an API key with the `search` scope for search actions and the `communications` scope for communication actions. Paste that key into the Pipedream connected account when prompted.

# Example Use Cases

- **Get Network Summary** checks LinkedIn sync readiness and available network filters.
- **Search People** finds people by role, company history, expertise, location, network relationship, or recent activity.
- **Search Companies** finds companies by name, domain, funding, size, industry, location, growth, or technology.
- **Search Jobs** finds jobs and can include warm-path people at each hiring company.
- **Search Posts** finds posts, comments, likes, reactions, company mentions, and other public activity signals.
- **Check Communication Capabilities** determines whether Gmail, LinkedIn, X, Instagram, or Super Carl channels are ready for a target.
- **Create Communication Draft** saves a durable message draft without live delivery.
- **Send Communication** creates a dry run by default and can send after explicit configuration.
- **Get Communication**, **Get Communication History**, and **Cancel Communication** monitor or stop communication workflows.

# Troubleshooting

If authentication fails, confirm that the API key has the required scope and has not been revoked. If a search returns weaker network-aware results than expected, run **Get Network Summary** to confirm the relevant LinkedIn, Gmail, or Super Carl network data is synced. Before live communication sends, run **Check Communication Capabilities** and review the chosen target, channel, and Dry Run setting.

For detailed API usage, see [Super Carl documentation](https://supercarl.ai/docs).
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import superCarl from "../../super_carl.app.mjs";
import { cleanObject } from "../../common/utils.mjs";

export default {
key: "super_carl-cancel-communication",
name: "Cancel Communication",
description: "Cancel a queued or in-progress Super Carl communication created by **Send Communication**. Use this when a workflow needs to stop delivery before the communication reaches a terminal status. [See the documentation](https://supercarl.ai/docs/endpoints)",
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
version: "0.0.1",
annotations: {
destructiveHint: true,
openWorldHint: true,
readOnlyHint: false,
},
type: "action",
props: {
superCarl,
communicationId: {
propDefinition: [
superCarl,
"communicationId",
],
},
reason: {
type: "string",
label: "Reason",
description: "Optional cancellation reason stored with the communication event log.",
optional: true,
},
},
async run({ $ }) {
const response = await this.superCarl.cancelCommunication({
$,
communicationId: this.communicationId,
data: cleanObject({
reason: this.reason,
}),
});

$.export("$summary", `Cancelled communication ${this.communicationId}.`);
return response;
},
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
import superCarl from "../../super_carl.app.mjs";
import {
cleanObject,
requireCommunicationTarget,
} from "../../common/utils.mjs";

export default {
key: "super_carl-check-communication-capabilities",
name: "Check Communication Capabilities",
description: "Check which Super Carl communication channels are available for a target before creating a draft or sending a message. Use this to select **Create Communication Draft** or **Send Communication** inputs, including channel, recipient email, and connector user IDs. [See the documentation](https://supercarl.ai/docs/endpoints)",
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
version: "0.0.1",
annotations: {
destructiveHint: false,
openWorldHint: true,
readOnlyHint: true,
},
type: "action",
props: {
superCarl,
targetUserId: {
propDefinition: [
superCarl,
"targetUserId",
],
},
linkedinProfileUrl: {
propDefinition: [
superCarl,
"linkedinProfileUrl",
],
},
linkedinUsername: {
propDefinition: [
superCarl,
"linkedinUsername",
],
},
xProfileUrl: {
propDefinition: [
superCarl,
"xProfileUrl",
],
},
xUsername: {
propDefinition: [
superCarl,
"xUsername",
],
},
instagramProfileUrl: {
propDefinition: [
superCarl,
"instagramProfileUrl",
],
},
instagramUsername: {
propDefinition: [
superCarl,
"instagramUsername",
],
},
recipientEmail: {
propDefinition: [
superCarl,
"recipientEmail",
],
},
channels: {
propDefinition: [
superCarl,
"communicationChannels",
],
},
delegateUserId: {
propDefinition: [
superCarl,
"delegateUserId",
],
},
},
async run({ $ }) {
const data = cleanObject({
target_user_id: this.targetUserId,
linkedin_profile_url: this.linkedinProfileUrl,
linkedin_username: this.linkedinUsername,
x_profile_url: this.xProfileUrl,
x_username: this.xUsername,
instagram_profile_url: this.instagramProfileUrl,
instagram_username: this.instagramUsername,
recipient_email: this.recipientEmail,
channels: this.channels,
delegate_user_id: this.delegateUserId,
});
requireCommunicationTarget(data);

const response = await this.superCarl.getCommunicationCapabilities({
$,
data,
});

const readyChannels = Array.isArray(response?.channels)
? response.channels.filter((channel) => channel?.can_send === true)
: [];
$.export("$summary", `Found ${readyChannels.length} ready communication channels.`);
return response;
},
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
import superCarl from "../../super_carl.app.mjs";
import {
cleanObject,
parseObjectProp,
requireCommunicationTarget,
} from "../../common/utils.mjs";

export default {
key: "super_carl-create-communication-draft",
name: "Create Communication Draft",
description: "Save a durable Super Carl communication draft without sending it. Use **Check Communication Capabilities** first to pick the channel and target fields; use **Send Communication** only after a user has approved live delivery. [See the documentation](https://supercarl.ai/docs/endpoints)",
version: "0.0.1",
annotations: {
destructiveHint: false,
openWorldHint: true,
readOnlyHint: false,
},
type: "action",
props: {
superCarl,
channel: {
propDefinition: [
superCarl,
"communicationChannel",
],
},
message: {
propDefinition: [
superCarl,
"message",
],
},
subject: {
propDefinition: [
superCarl,
"subject",
],
},
targetUserId: {
propDefinition: [
superCarl,
"targetUserId",
],
},
linkedinProfileUrl: {
propDefinition: [
superCarl,
"linkedinProfileUrl",
],
},
linkedinUsername: {
propDefinition: [
superCarl,
"linkedinUsername",
],
},
xProfileUrl: {
propDefinition: [
superCarl,
"xProfileUrl",
],
},
xUsername: {
propDefinition: [
superCarl,
"xUsername",
],
},
instagramProfileUrl: {
propDefinition: [
superCarl,
"instagramProfileUrl",
],
},
instagramUsername: {
propDefinition: [
superCarl,
"instagramUsername",
],
},
recipientEmail: {
propDefinition: [
superCarl,
"recipientEmail",
],
},
connectorUserId: {
propDefinition: [
superCarl,
"connectorUserId",
],
},
context: {
propDefinition: [
superCarl,
"context",
],
},
idempotencyKey: {
propDefinition: [
superCarl,
"idempotencyKey",
],
},
delegateUserId: {
propDefinition: [
superCarl,
"delegateUserId",
],
},
},
async run({ $ }) {
const context = parseObjectProp(this.context, "Context");
const data = cleanObject({
mode: "draft",
draft: true,
channel: this.channel,
message: this.message,
subject: this.subject,
target_user_id: this.targetUserId,
linkedin_profile_url: this.linkedinProfileUrl,
linkedin_username: this.linkedinUsername,
x_profile_url: this.xProfileUrl,
x_username: this.xUsername,
instagram_profile_url: this.instagramProfileUrl,
instagram_username: this.instagramUsername,
recipient_email: this.recipientEmail,
connector_user_id: this.connectorUserId,
context,
idempotency_key: this.idempotencyKey,
delegate_user_id: this.delegateUserId,
});
requireCommunicationTarget(data);

const response = await this.superCarl.createCommunication({
$,
data,
});

$.export("$summary", `Created communication draft ${response?.id || ""}`.trim());
return response;
},
};
Loading