Apollo.io
Datafly Signal writes high-intent lead events (lead captures, demo requests and sign-ups) to Apollo.io as CRM contacts using Apollo’s server-side Create a Contact API. Each qualifying event becomes a deduplicated Apollo contact your revenue team can sequence, enrich and route automatically — no client-side Apollo script required.
Apollo is a sales-intelligence and CRM platform; it does not expose an event or conversion API. Signal therefore delivers only lead-shaped events to Apollo, and sends them server-to-server with your API key so identifiers never pass through the browser.
Prerequisites
- An Apollo.io account on a plan that includes API access.
- An Apollo API key with the Create a Contact endpoint enabled. Apollo keys are scoped per-endpoint, so the key you use must explicitly grant access to contact creation.
- Lead events flowing into Signal that carry contact traits (
first_name,last_name,email). Apollo requires a first and last name to create a contact.
Configuration
Create the API key in Apollo:
- In Apollo, go to Settings → Integrations → API Keys.
- Click API Keys → Create new key.
- Give the key a name and description.
- Under endpoint access, enable Create a Contact.
- Copy the generated key.
Configure in Signal
- In the Signal management UI, open Integrations and add Apollo.io.
- Paste your Apollo API Key.
- Leave Deduplicate contacts enabled (recommended) so repeated lead events update the same contact instead of creating duplicates.
- Attach the Apollo integration to the pipeline that carries your lead events and save.
| Field | Required | Description |
|---|---|---|
| API Key | Yes | Apollo key with the Create a Contact endpoint enabled. Sent in the X-Api-Key header. |
| Deduplicate contacts | No | When on, sends run_dedupe=true so Apollo upserts on a match. Defaults to on. |
API Endpoint
Signal delivers each contact with a single request:
POST https://api.apollo.io/api/v1/contacts
X-Api-Key: <your API key>
Content-Type: application/jsonAuthentication is the X-Api-Key header only. Apollo does not accept the key in the query string or request body.
Identity Signals
Apollo is a CRM that matches and enriches contacts against cleartext identifiers, so Signal sends email and phone in plaintext — they are not hashed. Signal normalises them first: email is trimmed and lowercased, and phone is converted to E.164 format. The fields Signal maps to a contact are:
| Apollo field | Source trait |
|---|---|
first_name | first_name |
last_name | last_name |
email | email |
organization_name | company |
title | title |
mobile_phone | phone |
website_url | website |
label_names[] | lead source / sign-up method, plus a marketing-opt-in label when marketing consent is granted |
Event Mapping
The default blueprint maps three high-intent Signal events to Apollo contact creation. All other events are dropped.
| Signal event | Apollo action |
|---|---|
Lead Generated | Create / upsert contact |
Demo Requested | Create / upsert contact |
Signed Up | Create / upsert contact |
Each event must carry the contact’s traits. Example Datafly.js call:
datafly.identify({
first_name: "Tim",
last_name: "Zheng",
email: "tim@apollo.io",
company: "Apollo",
title: "Head of Growth",
phone: "+15553031234",
website: "https://www.apollo.io/"
});
datafly.track("Demo Requested", {
lead_source: "Website demo form"
});With marketing consent granted, Signal delivers:
{
"first_name": "Tim",
"last_name": "Zheng",
"email": "tim@apollo.io",
"organization_name": "Apollo",
"title": "Head of Growth",
"mobile_phone": "+15553031234",
"website_url": "https://www.apollo.io/",
"label_names": ["Signal - Marketing Opt-in", "Website demo form"],
"run_dedupe": true
}Consent
Contact creation is gated on marketing consent. Signal reads the canonical marketing-consent flag and only delivers the event to Apollo when consent is granted; when consent is absent or denied, the event is dropped before it reaches Apollo. A Signal - Marketing Opt-in label is added so opted-in contacts are easy to segment in Apollo.
Testing
- Trigger a
Demo Requested(orLead Generated/Signed Up) event from a page that has marketing consent granted, withfirst_name,last_nameandemailpopulated. - In Signal’s Event Debugger, confirm the event delivered to Apollo with a
200response. - In Apollo, open Search → People / Contacts and find the new contact by email. Confirm name, company, title and phone landed and that the lead-source / opt-in labels are attached.
- Re-trigger the same event for the same person and confirm Apollo updates the existing contact rather than creating a duplicate (deduplication enabled).
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
401 / 403 | Invalid key, or the key lacks the Create a Contact scope | Recreate the key in Apollo with the Create a Contact endpoint enabled. |
404 | Wrong endpoint path | Confirm the request targets /api/v1/contacts (with the /api segment). |
422 / 400 | Missing first_name or last_name | Ensure lead events carry both name traits; Apollo rejects contacts without them. |
| Duplicate contacts in Apollo | Deduplication disabled | Enable Deduplicate contacts so run_dedupe=true is sent. |
| Event never reaches Apollo | Marketing consent not granted, or event not in the mapped list | The blueprint only delivers Lead Generated, Demo Requested and Signed Up with marketing consent granted; everything else is dropped by design. |
429 | Apollo rate limit hit | Signal retries automatically; raise the limit on your Apollo plan if it persists. |