Quick Navigation
Export (Create)
Create new contacts and companies
Sync & Update
Sync existing records and push updates
Full Implementation
Complete working examples
Testing
Verify your implementation
Sync & Update Endpoints
Sync endpoints find existing records in your CRM and optionally return properties to sync back. Update endpoints push changes to records that were previously synced.Key Principle: All matching logic lives in YOUR CRM. Enginy sends data, and your CRM decides how to
match records (by email, domain, LinkedIn URL, etc.).
Contacts Sync
Match contacts by email, LinkedIn URL, or phone. Detailed examples and matching strategies.
Companies Sync
Match companies by domain, name, or LinkedIn URL. Includes domain normalization examples.
Quick Reference
| Endpoint | Method | Purpose |
|---|---|---|
/contacts/sync | POST | Find existing contacts, return crmId + properties |
/contacts | PUT | Update contacts that have crmId |
/companies/sync | POST | Find existing companies, return crmId + properties |
/companies | PUT | Update companies that have crmId |
Matching Strategy Summary
| Entity | Primary Match | Fallback | Normalization |
|---|---|---|---|
| Contacts | email (lowercase) | linkedinUrl | Remove trailing slashes |
| Companies | domain | linkedinUrl, name | Strip www., protocol, path |
Export (Create) Endpoints
These endpoints create new records that don’t exist in your CRM yet.Complete Implementation Examples
Below are full working examples of a Custom CRM API implementation in popular frameworks, including all endpoints for export (contacts, companies, associations), sync, update, tasks, and activities.GitHub Repository
Clone our reference implementation - a complete working Node.js/Express server with SQLite database,
including a web dashboard for viewing contacts, companies, tasks, and activities.
The reference implementation includes: - All required endpoints (health, contacts, companies, associations,
tasks, activities) - Optional users endpoint for owner assignment - SQLite database with Prisma ORM - Web
dashboard at
/ for viewing data - Contact/company detail pages showing associated activities - Full
activity logging with direction indicators (inbound/outbound)Minimal Implementation
If you want to get started quickly, here’s a minimal implementation with just the export endpoints:Node.js (Minimal Export)
Testing Checklist
Before connecting to Enginy, ensure all these tests pass:Health Endpoint
Health Endpoint
200 OK with {"status": "ok"}Get Users (Optional)
Get Users (Optional)
200 OK with array of users:404 Not Found.Create Contacts
Create Contacts
201 Created with {"results": [{"externalId": "123", "crmId": "..."}]}Create Companies
Create Companies
201 Created with {"results": [{"externalId": "456", "crmId": "..."}]}Create Associations
Create Associations
200 OK with {"success": true, "created": 1}Create Task
Create Task
201 Created with task object containing idCreate Activity
Create Activity
201 Created with activity object containing idCreate LinkedIn Activity
Create LinkedIn Activity
201 Created with activity object containing idGet Tasks Batch
Get Tasks Batch
200 OK with array of tasksComplete Tasks Batch
Complete Tasks Batch
200 OK with array of updated tasksUpdate Engagement Fields
Update Engagement Fields
200 OK with {"results": [{"crmId": "...", "success": true}]}Update Engagement Fields (Company)
Update Engagement Fields (Company)
200 OK with {"results": [{"crmId": "...", "success": true}]}Sync Contacts
Sync Contacts
200 OK with {"results": [{"externalId": "123", "crmId": "...", "properties": {...}}]}
Note: Only returns contacts that exist in your CRMUpdate Contacts
Update Contacts
200 OK with {"results": [{"crmId": "...", "success": true}]}Sync Companies
Sync Companies
200 OK with {"results": [{"externalId": "456", "crmId": "...", "properties": {...}}]}
Note: Only returns companies that exist in your CRMUpdate Companies
Update Companies
200 OK with {"results": [{"crmId": "...", "success": true}]}Create Activity (LinkedIn)
Create Activity (LinkedIn)
201 Created with activity object containing idCreate Activity (Email)
Create Activity (Email)
201 Created with activity object containing idUpdate Contact with Engagement Fields
Update Contact with Engagement Fields
200 OK with {"results": [{"crmId": "...", "success": true}]}
Note: Your CRM should store these custom engagement fieldsNext Steps
Connect Your CRM
Once your implementation is complete, connect your CRM to Enginy