Access the Apify API with managed authentication to run scrapers and manage actors, datasets, stores, and schedules.
Documents
Apollo
Try itAccess the Apollo.io API through a managed OAuth proxy to search, enrich, and manage sales data.
What it does
Reach the Apollo.io API through a managed OAuth proxy layer. Search people and organizations, enrich contacts by email or LinkedIn, and manage contacts, accounts, sequences, and labels with a single Bearer token. List endpoints paginate via POST bodies with page and per_page, write operations require explicit user approval, and the proxy enforces a 10 requests per second per-account limit.
When to use it
- Searching for prospects at a target company
- Enriching a contact from an email or LinkedIn URL
- Creating and updating Apollo contacts and accounts
- Adding contacts to outreach sequences
The skill document
Apollo
Access the Apollo.io API with managed OAuth authentication. Search people and organizations, enrich contacts, and manage your sales pipeline.
Quick Start
# Search for people at a company
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'q_organization_name': 'Google', 'per_page': 10}).encode()
req = urllib.request.Request('https://api.maton.ai/apollo/v1/mixed_people/api_search', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Base URL
https://api.maton.ai/apollo/{native-api-path}
Maton proxies requests to api.apollo.io and automatically injects your API key.
Authentication
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Getting Your API Key
- Sign in or create an account at maton.ai
- Go to maton.ai/settings
- Copy your API key
Connection Management
Manage your Apollo connections at https://api.maton.ai.
List Connections
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=apollo&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Create Connection
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'apollo'}).encode()
req = urllib.request.Request('https://api.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Get Connection
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"connection": {
"connection_id": "{connection_id}",
"status": "ACTIVE",
"creation_time": "2025-12-08T07:20:53.488460Z",
"last_updated_time": "2026-01-31T20:03:32.593153Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "apollo",
"metadata": {}
}
}
Open the returned url in a browser to complete OAuth authorization.
Delete Connection
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Specifying Connection
If you have multiple Apollo connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'q_organization_name': 'Google', 'per_page': 10}).encode()
req = urllib.request.Request('https://api.maton.ai/apollo/v1/mixed_people/api_search', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple connections, always include this header to ensure requests go to the intended account.
Security & Permissions
- Access is scoped to contacts, accounts, opportunities, sequences, and email data within the connected Apollo account.
- All write operations require explicit user approval. Before executing any create, update, or delete call, confirm the target resource and intended effect with the user.
API Reference
People
Search People
POST /apollo/v1/mixed_people/api_search
Content-Type: application/json
{
"q_organization_name": "Google",
"page": 1,
"per_page": 25
}
Enrich Person by Email
POST /apollo/v1/people/match
Content-Type: application/json
{
"email": "john@example.com"
}
Enrich Person by LinkedIn
POST /apollo/v1/people/match
Content-Type: application/json
{
"linkedin_url": "https://linkedin.com/in/johndoe"
}
Organizations
Search Organizations
POST /apollo/v1/organizations/search
Content-Type: application/json
{
"q_organization_name": "Google",
"page": 1,
"per_page": 25
}
Enrich Organization
POST /apollo/v1/organizations/enrich
Content-Type: application/json
{
"domain": "google.com"
}
Contacts
Search Contacts
POST /apollo/v1/contacts/search
Content-Type: application/json
{
"page": 1,
"per_page": 25
}
Create Contact
POST /apollo/v1/contacts
Content-Type: application/json
{
"first_name": "John",
"last_name": "Doe",
"email": "john@example.com",
"organization_name": "Acme Corp"
}
Update Contact
PUT /apollo/v1/contacts/{contactId}
Content-Type: application/json
{
"first_name": "Jane"
}
Accounts
Search Accounts
POST /apollo/v1/accounts/search
Content-Type: application/json
{
"page": 1,
"per_page": 25
}
Create Account
POST /apollo/v1/accounts
Content-Type: application/json
{
"name": "Acme Corp",
"domain": "acme.com"
}
Sequences
Search Sequences
POST /apollo/v1/emailer_campaigns/search
Content-Type: application/json
{
"page": 1,
"per_page": 25
}
Add Contact to Sequence
POST /apollo/v1/emailer_campaigns/{campaignId}/add_contact_ids
Content-Type: application/json
{
"contact_ids": ["contact_id_1", "contact_id_2"]
}
Labels
List Labels
GET /apollo/v1/labels
Search Filters
Common search parameters:
q_organization_name- Company nameq_person_title- Job titleperson_locations- Array of locationsorganization_num_employees_ranges- Employee count rangesq_keywords- General keyword search
Code Examples
JavaScript
const response = await fetch(
'https://api.maton.ai/apollo/v1/mixed_people/api_search',
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
},
body: JSON.stringify({
q_organization_name: 'Google',
per_page: 10
})
}
);
Python
import os
import requests
response = requests.post(
'https://api.maton.ai/apollo/v1/mixed_people/api_search',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
json={'q_organization_name': 'Google', 'per_page': 10}
)
Notes
- Pagination uses
pageandper_pagein POST body - Most list endpoints use POST with
/searchsuffix - Email enrichment consumes credits
people/searchandmixed_people/searchare deprecated - usemixed_people/api_search- IMPORTANT: When using curl commands, use
curl -gwhen URLs contain brackets (fields[],sort[],records[]) to disable glob parsing - IMPORTANT: When piping curl output to
jqor other commands, environment variables like$MATON_API_KEYmay not expand correctly in some shell environments. You may get "Invalid API key" errors when piping.
Error Handling
| Status | Meaning |
|---|---|
| 400 | Missing Apollo connection |
| 401 | Invalid or missing Maton API key |
| 429 | Rate limited (10 req/sec per account) |
| 4xx/5xx | Passthrough error from Apollo API |
Troubleshooting: API Key Issues
- Check that the
MATON_API_KEYenvironment variable is set:
echo $MATON_API_KEY
- Verify the API key is valid by listing connections:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Troubleshooting: Invalid App Name
- Ensure your URL path starts with
apollo. For example:
- Correct:
https://api.maton.ai/apollo/v1/mixed_people/api_search - Incorrect:
https://api.maton.ai/v1/mixed_people/api_search
Resources
Questions people ask
- How is authentication handled?
- All requests use a Bearer token set as the MATON_API_KEY environment variable. The proxy forwards calls to api.apollo.io and injects the underlying Apollo credentials, so no Apollo API key needs to be embedded in your code.
- Which Apollo endpoints are covered?
- People and organization search and enrichment, contact and account create/update, sequence search and contact assignment, and label listing — all under the /apollo/v1 prefix on api.maton.ai.
- What limits or guardrails apply?
- The proxy enforces 10 requests per second per account, email enrichment consumes Apollo credits, and every write operation must be confirmed with the user before it is sent.
Related skills
Query Google Ads campaigns, keywords, and metrics via GAQL with managed OAuth.
Create and manage Google Apps Script projects, deployments, versions, and remote script execution via an OAuth-managed API.
Connect to Google Search Console via a managed OAuth proxy to query search analytics, manage sitemaps, and inspect site performance.
Manage Confluence pages, spaces, blogposts, comments, and attachments via the Cloud API with managed OAuth.
Programmatic access to ClickFunnels 2.0 contacts, products, orders, courses, forms, and webhooks via managed OAuth.