OAuth & External APIs
OAuth & External APIs
OAuth 2.0 authentication for external services
OAuthManager class
📍 src/connectors/oauth/OAuthManager.ts:13
Constructor
constructor
constructor(config: OAuthConfig)
Parameters:
config:OAuthConfig
Methods
getToken()
Get valid access token Automatically refreshes if expired
async getToken(userId?: string, accountId?: string): Promise<string>
Parameters:
userId:string | undefined(optional)accountId:string | undefined(optional)
Returns: Promise<string>
refreshToken()
Force refresh the token
async refreshToken(userId?: string, accountId?: string): Promise<string>
Parameters:
userId:string | undefined(optional)accountId:string | undefined(optional)
Returns: Promise<string>
isTokenValid()
Check if current token is valid
async isTokenValid(userId?: string, accountId?: string): Promise<boolean>
Parameters:
userId:string | undefined(optional)accountId:string | undefined(optional)
Returns: Promise<boolean>
startAuthFlow()
Start authorization flow (Authorization Code only) Returns URL for user to visit
async startAuthFlow(userId?: string, accountId?: string): Promise<string>
Parameters:
userId:string | undefined(optional)accountId:string | undefined(optional)
Returns: Promise<string>
handleCallback()
Handle OAuth callback (Authorization Code only) Call this with the callback URL after user authorizes
Returns an optional raw ID token for caller-side OIDC verification. The ID token is not verified or persisted by the library; non-OIDC flows return {}.
async handleCallback(callbackUrl: string, userId?: string, accountId?: string): Promise<OAuthCallbackResult>
Parameters:
callbackUrl:stringuserId:string | undefined(optional)accountId:string | undefined(optional)
Returns: Promise<OAuthCallbackResult>
revokeToken()
Revoke token (if supported by provider)
async revokeToken(revocationUrl?: string, userId?: string, accountId?: string): Promise<void>
Parameters:
revocationUrl:string | undefined(optional)userId:string | undefined(optional)accountId:string | undefined(optional)
Returns: Promise<void>
listAccounts()
List account aliases for a user (Authorization Code only)
async listAccounts(userId?: string): Promise<string[]>
Parameters:
userId:string | undefined(optional)
Returns: Promise<string[]>
rekeyAccount()
Re-key a token from one accountId to another (Authorization Code only).
async rekeyAccount(userId: string, oldAccountId: string, newAccountId: string): Promise<boolean>
Parameters:
userId:stringoldAccountId:stringnewAccountId:string
Returns: Promise<boolean>
removeAccount()
Remove a specific account's stored token (Authorization Code only). Used when a user unlinks/disconnects one of their accounts.
async removeAccount(userId: string, accountId: string): Promise<boolean>
Parameters:
userId:stringaccountId:string
Returns: Promise<boolean>
ApplyRefreshStrategyOptions interface
📍 src/connectors/vendors/helpers.ts:118
Options for applying provider refresh requirements to an existing configuration.
Properties
| Property | Type | Description |
|---|---|---|
enforce? |
enforce?: boolean; |
Enforce the strategy's authorization parameter over a conflicting value. Default: false. |
requiredScope? |
requiredScope?: string; |
Other required scope tokens to preserve and merge, without importing template scopes. |
AuthTemplate interface
📍 src/connectors/vendors/types.ts:44
Authentication template for a vendor Defines a single authentication method (e.g., API key, OAuth user flow)
Properties
| Property | Type | Description |
|---|---|---|
id |
id: string; |
Unique auth method ID within vendor (e.g., 'pat', 'oauth-user', 'github-app') |
name |
name: string; |
Human-readable name (e.g., 'Personal Access Token') |
type |
`type: 'api_key' | 'oauth';` |
flow? |
`flow?: 'authorization_code' | 'client_credentials' |
description |
description: string; |
When to use this auth method |
requiredFields |
requiredFields: AuthTemplateField[]; |
Fields user must provide (e.g., ['apiKey'], ['clientId', 'clientSecret', 'redirectUri']) |
optionalFields? |
optionalFields?: AuthTemplateField[]; |
Optional fields user may provide |
defaults |
defaults: Partial<ConnectorAuth>; |
Pre-filled OAuth URLs and defaults |
scopes? |
scopes?: string[]; |
Common scopes for this auth method |
scopeDescriptions? |
scopeDescriptions?: Record<string, string>; |
Human-readable descriptions for scopes (key = scope ID) |
refreshStrategy? |
refreshStrategy?: RefreshStrategy; |
How this vendor issues refresh tokens. Required when |
flow === 'authorization_code'; ignored otherwise. Drives the force-merge |
||
| that requests refresh-capable access; provider consent/setup still applies. | ||
| Validated at registry-init time — missing on an auth-code template throws. |
BuildAuthConfigOptions interface
📍 src/connectors/vendors/helpers.ts:181
Options for editing a same-method authorization-code configuration.
Properties
| Property | Type | Description |
|---|---|---|
existingAuth? |
existingAuth?: ConnectorAuth; |
Preserve saved settings; nonempty supplied template credentials replace their fields. |
CreateConnectorOptions interface
📍 src/connectors/vendors/types.ts:212
Options for creating a connector from a template
Properties
| Property | Type | Description |
|---|---|---|
baseURL? |
baseURL?: string; |
Override the default baseURL |
description? |
description?: string; |
Additional description for the connector |
displayName? |
displayName?: string; |
Human-readable display name |
timeout? |
timeout?: number; |
Request timeout in ms |
logging? |
logging?: boolean; |
Enable request/response logging |
vendorOptions? |
vendorOptions?: Record<string, unknown>; |
Vendor-specific options (e.g., defaultFromNumber for Twilio). Stored in connector.config.options. |
ITokenStorage interface
📍 src/connectors/oauth/domain/ITokenStorage.ts:19
Token storage interface All implementations MUST encrypt tokens before storing
Methods
storeToken()
Store token (must be encrypted by implementation)
storeToken(key: string, token: StoredToken): Promise<void>;
Parameters:
key:stringtoken:StoredToken
Returns: Promise<void>
getToken()
Retrieve token (must be decrypted by implementation)
getToken(key: string): Promise<StoredToken | null>;
Parameters:
key:string
Returns: Promise<StoredToken | null>
deleteToken()
Delete token
deleteToken(key: string): Promise<void>;
Parameters:
key:string
Returns: Promise<void>
hasToken()
Check if token exists
hasToken(key: string): Promise<boolean>;
Parameters:
key:string
Returns: Promise<boolean>
listKeys()?
List all storage keys (for account enumeration). Optional — implementations that support it enable multi-account listing.
listKeys?(): Promise<string[]>;
Returns: Promise<string[]>
OAuthCallbackResult interface
📍 src/connectors/oauth/types.ts:80
Result of one authorization-code exchange; never persisted by token storage.
Properties
| Property | Type | Description |
|---|---|---|
idToken? |
idToken?: string; |
Raw, unverified ID token. Verify signature, issuer, audience, expiry and nonce before using its claims; do not log or expose it to untrusted clients. |
OAuthConfig interface
📍 src/connectors/oauth/types.ts:9
Properties
| Property | Type | Description |
|---|---|---|
flow |
flow: OAuthFlow; |
- |
tokenUrl |
tokenUrl: string; |
- |
clientId |
clientId: string; |
- |
authorizationUrl? |
authorizationUrl?: string; |
- |
redirectUri? |
redirectUri?: string; |
- |
scope? |
scope?: string; |
- |
usePKCE? |
usePKCE?: boolean; |
- |
requiredScope? |
requiredScope?: string; |
Vendor-mandated scope token for refresh-token issuance (e.g. offline_access, |
refresh_token, offline.access). Sourced from the vendor template's |
||
RefreshStrategy; force-merged into the authorize URL scope parameter |
||
even when the operator overrides scope (e.g. Microsoft .default). |
||
clientSecret? |
clientSecret?: string; |
- |
privateKey? |
privateKey?: string; |
- |
privateKeyPath? |
privateKeyPath?: string; |
- |
tokenSigningAlg? |
tokenSigningAlg?: string; |
- |
audience? |
audience?: string; |
- |
tokenRequestStyle? |
`tokenRequestStyle?: 'form' | 'bearer';` |
'form'(default, RFC 7523): POST application/x-www-form-urlencoded withgrant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=<JWT>.'bearer'(GitHub App installation tokens and similar): POST with anAuthorization: Bearer <JWT>header and no body. Response field for the token istoken(notaccess_token) and expiry isexpires_atISO string (notexpires_inseconds). | |tokenLifetimeSeconds?|tokenLifetimeSeconds?: number;| JWTexplifetime, in seconds. Default 3600. GitHub rejects JWTs withexpmore than 10 minutes in the future; set to 540 for GitHub Apps. | |subject?|subject?: string;| JWTsubclaim override. For Google Workspace domain-wide delegation this is the email of the user being impersonated; the resulting access token acts as that user. When unset,subdefaults toclientId(RFC 7523 convention for service-account self-auth). | |staticToken?|staticToken?: string;| - | |authorizationParams?|authorizationParams?: Record<string, string>;| Extra query parameters appended to the authorization URL. Used for vendor-specific requirements, e.g. Google'saccess_type: 'offline'to obtain a refresh token.scopehere is a legacy fallback only when the dedicatedscopefield is absent; it cannot overriderequiredScope. | |autoRefresh?|autoRefresh?: boolean;| - | |refreshBeforeExpiry?|refreshBeforeExpiry?: number;| - | |storage?|storage?: ITokenStorage;| - | |storageKey?|storageKey?: string;| - |
OAuthConnectorAuth interface
📍 src/domain/entities/Connector.ts:36
OAuth 2.0 authentication for connectors Supports multiple OAuth flows
Properties
| Property | Type | Description |
|---|---|---|
type |
type: 'oauth'; |
- |
flow |
`flow: 'authorization_code' | 'client_credentials' |
clientId |
clientId: string; |
- |
clientSecret? |
clientSecret?: string; |
- |
tokenUrl |
tokenUrl: string; |
- |
authorizationUrl? |
authorizationUrl?: string; |
- |
redirectUri? |
redirectUri?: string; |
- |
scope? |
scope?: string; |
- |
usePKCE? |
usePKCE?: boolean; |
- |
requiredScope? |
requiredScope?: string; |
Vendor-mandated scope token that must appear in every authorize URL for |
refresh-token issuance (e.g. offline_access for Microsoft / Atlassian, |
||
refresh_token for Salesforce, offline.access for Twitter/X). Stamped |
||
by buildAuthConfig from the template's RefreshStrategy. Force-merged |
||
into scope at URL-build time so operator scope overrides |
||
(e.g. Microsoft .default) can't drop it. Idempotent. |
||
privateKey? |
privateKey?: string; |
- |
privateKeyPath? |
privateKeyPath?: string; |
- |
issuer? |
issuer?: string; |
- |
subject? |
subject?: string; |
- |
audience? |
audience?: string; |
- |
tokenRequestStyle? |
`tokenRequestStyle?: 'form' | 'bearer';` |
'form'(default, RFC 7523): POST with grant_type + assertion body.'bearer'(GitHub App installation tokens): POST withAuthorization: Bearer <JWT>header and no body. | |tokenLifetimeSeconds?|tokenLifetimeSeconds?: number;| JWTexplifetime in seconds (default 3600; GitHub caps at 600). | |refreshBeforeExpiry?|refreshBeforeExpiry?: number;| - | |storageKey?|storageKey?: string;| - | |authorizationParams?|authorizationParams?: Record<string, string>;| Extra query parameters appended to the authorization URL. Used for vendor-specific requirements, e.g. Google'saccess_type: 'offline'.scopehere is a legacy fallback only when the dedicatedscopefield is absent; it cannot overriderequiredScope. | |extra?|extra?: Record<string, string>;| Vendor-specific extra credentials |
OptionField interface
📍 src/connectors/vendors/types.ts:117
Vendor-specific option field definition.
Declares a configurable option that UI apps render as form fields.
Values are stored in connector.config.options and accessed via connector.getOptions().
Properties
| Property | Type | Description |
|---|---|---|
key |
key: string; |
Option key stored in connector.config.options (e.g., 'defaultFromNumber') |
label |
label: string; |
Human-readable label for UI display (e.g., 'Default From Number') |
description |
description: string; |
Help text / placeholder shown in the UI |
required? |
required?: boolean; |
Whether the option must be provided (default: false) |
type? |
`type?: 'string' | 'number' |
defaultValue? |
`defaultValue?: string | number |
placeholder? |
placeholder?: string; |
Placeholder text for the input field |
SimpleIcon interface
📍 src/connectors/vendors/logos.ts:11
Simple Icons icon data structure
Properties
| Property | Type | Description |
|---|---|---|
title |
title: string; |
- |
slug |
slug: string; |
- |
svg |
svg: string; |
- |
path |
path: string; |
- |
source |
source: string; |
- |
hex |
hex: string; |
- |
guidelines? |
guidelines?: string; |
- |
license? |
`license?: { |
type: string;
url?: string;
};` | - |
StoredToken interface
📍 src/connectors/oauth/types.ts:95
Properties
| Property | Type | Description |
|---|---|---|
access_token |
access_token: string; |
- |
refresh_token? |
refresh_token?: string; |
- |
expires_in |
expires_in: number; |
- |
token_type |
token_type: string; |
- |
scope? |
scope?: string; |
- |
obtained_at |
obtained_at: number; |
- |
StoredToken interface
📍 src/connectors/oauth/domain/ITokenStorage.ts:6
Token storage interface (Clean Architecture - Domain Layer) All implementations must encrypt tokens at rest
Properties
| Property | Type | Description |
|---|---|---|
access_token |
access_token: string; |
- |
refresh_token? |
refresh_token?: string; |
- |
expires_in |
expires_in: number; |
- |
token_type |
token_type: string; |
- |
scope? |
scope?: string; |
- |
obtained_at |
obtained_at: number; |
- |
VendorInfo interface
📍 src/connectors/vendors/helpers.ts:520
Get vendor template information for display
Properties
| Property | Type | Description |
|---|---|---|
id |
id: string; |
- |
name |
name: string; |
- |
category |
category: string; |
- |
docsURL? |
docsURL?: string; |
- |
credentialsSetupURL? |
credentialsSetupURL?: string; |
- |
authMethods |
`authMethods: { |
id: string;
name: string;
type: string;
description: string;
requiredFields: string[];
scopes?: string[];
scopeDescriptions?: Record<string, string>;
}[];` | - |
VendorLogo interface
📍 src/connectors/vendors/logos.ts:184
Vendor logo information
Properties
| Property | Type | Description |
|---|---|---|
vendorId |
vendorId: string; |
Vendor ID |
svg |
svg: string; |
SVG content |
hex |
hex: string; |
Brand color (hex without #) |
isPlaceholder |
isPlaceholder: boolean; |
Whether this is a placeholder (no official icon) |
simpleIconsSlug? |
simpleIconsSlug?: string; |
Simple Icons slug (if available) |
VendorRegistryEntry interface
📍 src/connectors/vendors/types.ts:179
Registry entry for a vendor (generated at build time)
Properties
| Property | Type | Description |
|---|---|---|
id |
id: string; |
Vendor ID |
name |
name: string; |
Human-readable name |
serviceType |
serviceType: string; |
Service type for ConnectorTools integration |
category |
category: ServiceCategory; |
Category from Services.ts |
authMethods |
authMethods: string[]; |
List of supported auth method IDs |
credentialsSetupURL? |
credentialsSetupURL?: string; |
URL for credential setup |
template |
template: VendorTemplate; |
Full vendor template (for programmatic access) |
VendorTemplate interface
📍 src/connectors/vendors/types.ts:144
Vendor template definition Complete configuration for a vendor's supported authentication methods
Properties
| Property | Type | Description |
|---|---|---|
id |
id: string; |
Unique vendor ID (matches Services.ts id, e.g., 'github', 'slack') |
name |
name: string; |
Human-readable name (e.g., 'GitHub', 'Slack') |
serviceType |
serviceType: string; |
Service type for ConnectorTools integration (matches serviceType in ConnectorConfig) |
baseURL |
baseURL: string; |
Default API base URL |
docsURL? |
docsURL?: string; |
API documentation URL |
credentialsSetupURL? |
credentialsSetupURL?: string; |
URL for setting up credentials on vendor's side |
authTemplates |
authTemplates: AuthTemplate[]; |
All supported authentication methods |
category |
category: ServiceCategory; |
Category from Services.ts |
notes? |
notes?: string; |
Additional notes about the vendor's authentication |
optionFields? |
optionFields?: OptionField[]; |
Vendor-specific option fields (stored in connector.config.options). UI apps render these as form fields. |
AuthTemplateField type
📍 src/connectors/vendors/types.ts:87
Known fields that can be required/optional in auth templates
type AuthTemplateField = | 'apiKey'
| 'clientId'
| 'clientSecret'
| 'redirectUri'
| 'scope'
| 'privateKey'
| 'privateKeyPath'
| 'appId'
| 'installationId'
| 'tenantId'
| 'username'
| 'subject'
| 'audience'
| 'userScope'
| 'accountId'
| 'subdomain'
| 'region'
| 'accessKeyId'
| 'secretAccessKey'
| 'applicationKey'
// Vendor-specific extra fields (stored in auth.extra)
| 'appToken'
| 'signingSecret'
OAuthFlow type
📍 src/connectors/oauth/types.ts:7
type OAuthFlow = 'authorization_code' | 'client_credentials' | 'jwt_bearer' | 'static_token'
RefreshStrategy type
📍 src/connectors/vendors/types.ts:33
How a vendor issues refresh tokens for authorization_code flows. Determines
what (if anything) the library merges into authorize URLs to request renewal
capability. Issuance still depends on provider policy and existing consent. Required for every
authorization_code template — the registry initializer fails fast if absent.
automatic: vendor issues a refresh token unconditionally (Discord, Asana, HubSpot, Stripe, QuickBooks, Box, Zoom, Pipedrive, Ramp, Atlassian-Bitbucket).never_expires: tokens don't expire (or have multi-year lifetime), no refresh ever needed (Notion, Linear, Airtable PAT, GitHub OAuth Apps, Slack classic bot tokens).scope: a specific scope token must be in the authorize request. Microsoft / Atlassian / GitLab useoffline_access; Salesforce usesrefresh_token; Twitter/X usesoffline.access(note the dot). Force-merged on every authorize URL to survive operator scope overrides.auth_param: a query param must be on the authorize URL. Google usesaccess_type=offline; Dropbox usestoken_access_type=offline. Stamped into the persistedauthorizationParams.manual_setup: refresh tokens require out-of-band IdP / app config the library can't enforce (GitHub App "expire user tokens" toggle, Slack token rotation enable). Surfaces a warning at template-import time.
type RefreshStrategy = | { kind: 'automatic' }
| { kind: 'never_expires' }
| { kind: 'scope'; scope: string }
| { kind: 'auth_param'; key: string; value: string }
| { kind: 'manual_setup'; description: string }
TemplateCredentials type
📍 src/connectors/vendors/types.ts:205
Credentials provided by user when creating connector from template
type TemplateCredentials = {
[K in AuthTemplateField]?: string;
}
applyRefreshStrategy function
📍 src/connectors/vendors/helpers.ts:136
Apply only a provider's refresh requirements. Pure and idempotent: configured
API scopes and unrelated parameters (including prompt) are preserved.
scope is authoritative, including an explicit empty string. When absent,
fall back to authorizationParams.scope; remove that duplicate parameter
from the returned patch so it cannot override edits or required scopes.
With enforce enabled, a missing strategy is an error and the strategy's
authorization parameter wins. Existing three-argument calls keep their
operator-value precedence. This requests renewal capability; it does not
guarantee a refresh token in every response or perform manual provider setup.
export function applyRefreshStrategy(
scope: string | undefined,
authorizationParams: Record<string, string> | undefined,
strategy: RefreshStrategy | undefined,
options: ApplyRefreshStrategyOptions = {},
): {
scope: string;
requiredScope: string | undefined;
authorizationParams: Record<string, string> | undefined;
}
authenticatedFetch function
📍 src/connectors/authenticatedFetch.ts:51
Fetch with automatic authentication using connector's configured auth scheme
Same API as standard fetch(), but with additional authProvider and optional userId/accountId parameters. Authentication is handled automatically based on the connector's configuration:
- Bearer tokens (GitHub, Slack, Stripe)
- Bot tokens (Discord)
- Basic auth (Twilio, Zendesk)
- Custom headers (e.g., X-Shopify-Access-Token)
export async function authenticatedFetch(
url: string | URL,
options: RequestInit | undefined,
authProvider: string,
userId?: string,
accountId?: string
): Promise<Response>
Example:
Single-user mode:
const response = await authenticatedFetch(
'https://graph.microsoft.com/v1.0/me',
{ method: 'GET' },
'microsoft'
);
const data = await response.json();
Multi-account mode:
const response = await authenticatedFetch(
'https://graph.microsoft.com/v1.0/me',
{ method: 'GET' },
'microsoft',
'alice',
'work' // Use Alice's work Microsoft account
);
buildAuthConfig function
📍 src/connectors/vendors/helpers.ts:259
Build ConnectorAuth from a template and credentials. Creation uses template defaults. With existingAuth, preserve saved authorization-code settings and apply only the nonempty credential patch plus provider refresh requirements.
export function buildAuthConfig(
authTemplate: AuthTemplate,
credentials: TemplateCredentials,
options: BuildAuthConfigOptions = {},
): ConnectorAuth
createAuthenticatedFetch function
📍 src/connectors/authenticatedFetch.ts:98
Create an authenticated fetch function bound to a specific connector and optionally a user/account
Useful for creating reusable fetch functions for a specific API and/or user. Uses connector's configured auth scheme (Bearer, Bot, Basic, custom headers).
export function createAuthenticatedFetch(
authProvider: string,
userId?: string,
accountId?: string
): (url: string | URL, options?: RequestInit) => Promise<Response>
Example:
Single-user mode:
const msftFetch = createAuthenticatedFetch('microsoft');
// Use like normal fetch (auth automatic)
const me = await msftFetch('https://graph.microsoft.com/v1.0/me');
const emails = await msftFetch('https://graph.microsoft.com/v1.0/me/messages');
Multi-account mode:
// Create fetch for Alice's work Microsoft account
const workFetch = createAuthenticatedFetch('microsoft', 'alice', 'work');
const personalFetch = createAuthenticatedFetch('microsoft', 'alice', 'personal');
const workEmails = await workFetch('/me/messages');
const personalEmails = await personalFetch('/me/messages');
createConnectorFromTemplate function
📍 src/connectors/vendors/helpers.ts:452
Create a Connector from a vendor template
export function createConnectorFromTemplate(
name: string,
vendorId: string,
authTemplateId: string,
credentials: TemplateCredentials,
options?: CreateConnectorOptions
): Connector
Example:
const connector = createConnectorFromTemplate(
'my-github',
'github',
'pat',
{ apiKey: process.env.GITHUB_TOKEN }
);
extractNonSecretCredentials function
📍 src/connectors/vendors/helpers.ts:393
Extract non-secret credentials from a raw credentials dict. Used by ConnectorConfigStore.saveFromTemplate() to preserve template field values for round-trip editing without storing secrets.
export function extractNonSecretCredentials(
authTemplate: AuthTemplate,
credentials: TemplateCredentials,
): Record<string, string>
generateEncryptionKey function
📍 src/connectors/oauth/utils/encryption.ts:107
Generate a secure random encryption key Use this to generate OAUTH_ENCRYPTION_KEY for your .env file
export function generateEncryptionKey(): string
getAllVendorLogos function
📍 src/connectors/vendors/logos.ts:298
Get all available vendor logos
export function getAllVendorLogos(): Map<string, VendorLogo>
getAllVendorTemplates function
📍 src/connectors/vendors/helpers.ts:65
Get all vendor templates
export function getAllVendorTemplates(): VendorTemplate[]
getCredentialsSetupURL function
📍 src/connectors/vendors/helpers.ts:603
Get credentials setup URL for a vendor
export function getCredentialsSetupURL(vendorId: string): string | undefined
getDocsURL function
📍 src/connectors/vendors/helpers.ts:611
Get docs URL for a vendor
export function getDocsURL(vendorId: string): string | undefined
getVendorAuthTemplate function
📍 src/connectors/vendors/helpers.ts:77
Get auth template for a vendor
export function getVendorAuthTemplate(
vendorId: string,
authId: string
): AuthTemplate | undefined
getVendorColor function
📍 src/connectors/vendors/logos.ts:288
Get the brand color for a vendor
export function getVendorColor(vendorId: string): string | undefined
getVendorInfo function
📍 src/connectors/vendors/helpers.ts:540
Get vendor information suitable for display
export function getVendorInfo(vendorId: string): VendorInfo | undefined
getVendorLogo function
📍 src/connectors/vendors/logos.ts:227
Get logo for a vendor
export function getVendorLogo(vendorId: string): VendorLogo | undefined
Example:
const logo = getVendorLogo('github');
if (logo) {
console.log(logo.svg); // SVG content
console.log(logo.hex); // Brand color
}
getVendorLogoCdnUrl function
📍 src/connectors/vendors/logos.ts:330
Get CDN URL for a vendor's logo
export function getVendorLogoCdnUrl(vendorId: string, color?: string): string | undefined
getVendorLogoSvg function
📍 src/connectors/vendors/logos.ts:270
Get SVG content for a vendor logo
export function getVendorLogoSvg(vendorId: string, color?: string): string | undefined
getVendorTemplate function
📍 src/connectors/vendors/helpers.ts:53
Get vendor template by ID
export function getVendorTemplate(vendorId: string): VendorTemplate | undefined
hasVendorLogo function
📍 src/connectors/vendors/logos.ts:200
Check if a vendor has a logo available
export function hasVendorLogo(vendorId: string): boolean
listVendorIds function
📍 src/connectors/vendors/helpers.ts:89
List all vendor IDs
export function listVendorIds(): string[]
listVendors function
📍 src/connectors/vendors/helpers.ts:565
List all vendors with basic info
export function listVendors(): VendorInfo[]
listVendorsByAuthType function
📍 src/connectors/vendors/helpers.ts:594
List vendors that support a specific auth type
export function listVendorsByAuthType(authType: 'api_key' | 'oauth'): VendorInfo[]
listVendorsByCategory function
📍 src/connectors/vendors/helpers.ts:587
List vendors by category
export function listVendorsByCategory(category: string): VendorInfo[]
listVendorsWithLogos function
📍 src/connectors/vendors/logos.ts:314
List vendor IDs that have logos available
export function listVendorsWithLogos(): string[]
VENDOR_ICON_MAP const
📍 src/connectors/vendors/logos.ts:26
Mapping from our vendor IDs to Simple Icons slugs
Properties
| Property | Type | Description |
|---|---|---|
microsoft |
'microsoft' |
- |
google |
'google' |
- |
'google-api' |
'google' |
- |
aws |
'amazonwebservices' |
- |
azure |
'microsoftazure' |
- |
gcp |
'googlecloud' |
- |
discord |
'discord' |
- |
slack |
'slack' |
- |
telegram |
'telegram' |
- |
twitter |
'x' |
- |
'microsoft-teams' |
'microsoftteams' |
- |
salesforce |
'salesforce' |
- |
hubspot |
'hubspot' |
- |
pipedrive |
'pipedrive' |
- |
'cal-com' |
'caldotcom' |
- |
calendly |
'calendly' |
- |
heyreach |
null |
- |
emailbison |
null |
- |
clay |
null |
- |
github |
'github' |
- |
gitlab |
'gitlab' |
- |
bitbucket |
'bitbucket' |
- |
jira |
'jira' |
- |
confluence |
'confluence' |
- |
trello |
'trello' |
- |
linear |
'linear' |
- |
asana |
'asana' |
- |
notion |
'notion' |
- |
airtable |
'airtable' |
- |
'google-workspace' |
'google' |
- |
'google-drive' |
'googledrive' |
- |
'microsoft-365' |
'microsoft365' |
- |
onedrive |
'onedrive' |
- |
stripe |
'stripe' |
- |
paypal |
'paypal' |
- |
quickbooks |
'quickbooks' |
- |
ramp |
null |
- |
sendgrid |
'sendgrid' |
- |
mailchimp |
'mailchimp' |
- |
postmark |
'postmark' |
- |
dropbox |
'dropbox' |
- |
box |
'box' |
- |
datadog |
'datadog' |
- |
pagerduty |
'pagerduty' |
- |
sentry |
'sentry' |
- |
serper |
null |
- |
'brave-search' |
'brave' |
- |
tavily |
null |
- |
rapidapi |
'rapidapi' |
- |
zenrows |
null |
- |
twilio |
'twilio' |
- |
zendesk |
'zendesk' |
- |
intercom |
'intercom' |
- |
shopify |
'shopify' |
- |