AngelSend API
Build custom integrations and extend your outreach capabilities. Access contacts, campaigns, voice agents, AI chat, booking, and more via our RESTful APIs.
Contacts & Lead Management
Import leads from data providers and verify contact data
Lead Scraping & Automation
Automated scraping workflows for lead generation
Mass Email Outreach (via Resend)
Send campaign emails at scale through verified custom domains using Resend
AI & Reply Handling
AI-powered assistant and intelligent reply management
LinkedIn Outreach
LinkedIn connection requests and messaging
Voice & SMS Agents
AI-powered voice agents via Twilio, Telnyx & ElevenLabs
AI Chat Widget
Embeddable AI chat widget with knowledge base, plus REST + MCP endpoints so a coding agent can update widget config, AI instructions, knowledge entries, and handoff rules on the fly.
Contact Form Outreach
Submit outreach through a prospect's website contact form as a campaign send channel or on demand. Detects and refuses CAPTCHA-protected forms, and runs the same block-list/dedup/rate-limit compliance as email. Available as an edge function, REST action, and MCP tool.
Booking & Calendar
Meeting scheduling with calendar sync
Gmail Inbox Management
Manage inbox correspondence, track replies, and sync email threads via Google API
CRM & Integrations
Connect with Google Contacts, Drive, Slack, HubSpot, Salesforce, and more
Embed Forms & Lead Capture
Embeddable forms for newsletter signups and lead capture
Analytics & Admin
Access analytics, pricing tiers, and admin functions
Authentication & OAuth
API key generation and OAuth provider system
External App OAuth System
Allow external apps to connect their users' Gmail or Outlook and use AngelSend's integrations
Available Edge Functions
All APIs are deployed as serverless edge functions for low latency and high availability.
Native & Desktop OAuth Integration
Best practices for partners building mobile or desktop apps that connect AngelSend-managed Google OAuth on behalf of their users.
Seeing Google Error 403: disallowed_useragent?
This is a Google security policy, not an AngelSend bug. Google blocks OAuth inside embedded webviews, in-app browsers, Electron BrowserWindows, CEF/WebView2, and any non-standard User-Agent. Open the OAuth URL in the user's real system browser instead.
Why this happens
Google requires OAuth flows to run in a trusted system browser so the user can verify the URL and security indicators. Embedded webviews hide those indicators, so Google rejects them with disallowed_useragent. This affects mobile apps that use a WebView, desktop apps built with Electron or CEF, and any custom browser that overrides its User-Agent.
The correct pattern
- Call
/external-oauth-initto receive anauth_url. - Open that URL in the system browser (Custom Tabs, ASWebAuthenticationSession, shell.openExternal, Linking.openURL).
- Register a redirect URI that returns control to your app: a custom URL scheme like
yourapp://oauth/callbackor a loopback address likehttp://127.0.0.1:port/callback. - Add the redirect URI to your External App's allowed list in AngelSend.
- Extract the code and state when the browser redirects back.
Electron (desktop)
const { shell, app } = require('electron');
// 1. Get auth_url from AngelSend
const { auth_url } = await fetchExternalOAuthInit({
client_id: 'your_client_id',
external_user_id: 'your_user_id',
callback_url: 'http://127.0.0.1:8765/callback',
provider: 'google',
scopes: ['calendar', 'email'],
});
// 2. Open in the user's real browser
shell.openExternal(auth_url);
// 3. Handle custom protocol redirect
app.setAsDefaultProtocolClient('yourapp');
app.on('open-url', (event, url) => {
const { searchParams } = new URL(url);
const code = searchParams.get('code');
const state = searchParams.get('state');
// exchange code + state with your backend
});React Native
import { Linking } from 'react-native';
const { auth_url } = await fetchExternalOAuthInit({
client_id: 'your_client_id',
external_user_id: 'your_user_id',
callback_url: 'yourapp://oauth/callback',
provider: 'google',
scopes: ['calendar', 'email'],
});
Linking.openURL(auth_url);
Linking.addEventListener('url', (event) => {
const url = new URL(event.url);
const code = url.searchParams.get('code');
const state = url.searchParams.get('state');
// send to backend
});Register your redirect URI
Add every redirect URI you plan to use to your External App registration:
POST /oauth-register-client
{
"name": "Your App",
"redirect_uris": [
"https://yourapp.com/oauth/callback",
"yourapp://oauth/callback",
"http://127.0.0.1:8765/callback"
]
}Common mistakes
- Opening the OAuth URL in an embedded WebView or hidden browser layer.
- Using
http://localhoston mobile — use a custom URL scheme instead. - Forgetting to add the redirect URI to the External App's allowed list.
- Sending the
client_secretto the client — keep it server-side.
Ready to Start Building?
Generate your API key in the dashboard settings and start integrating AngelSend into your applications. Full documentation available for all endpoints.