Skip to main content

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

Matching Strategy Summary


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:
Expected: 200 OK with {"status": "ok"}
Expected: 200 OK with array of users:
Note: This endpoint is optional. If you don’t want owner selection, return 404 Not Found.
Expected: 201 Created with {"results": [{"externalId": "123", "crmId": "..."}]}
Expected: 201 Created with {"results": [{"externalId": "456", "crmId": "..."}]}
Expected: 200 OK with {"success": true, "created": 1}
Expected: 201 Created with task object containing id
Expected: 201 Created with activity object containing id
Expected: 201 Created with activity object containing id
Expected: 200 OK with array of tasks
Expected: 200 OK with array of updated tasks
Expected: 200 OK with {"results": [{"crmId": "...", "success": true}]}
Expected: 200 OK with {"results": [{"crmId": "...", "success": true}]}
Expected: 200 OK with {"results": [{"externalId": "123", "crmId": "...", "properties": {...}}]} Note: Only returns contacts that exist in your CRM
Expected: 200 OK with {"results": [{"crmId": "...", "success": true}]}
Expected: 200 OK with {"results": [{"externalId": "456", "crmId": "...", "properties": {...}}]} Note: Only returns companies that exist in your CRM
Expected: 200 OK with {"results": [{"crmId": "...", "success": true}]}
Expected: 201 Created with activity object containing id
Expected: 201 Created with activity object containing id
Expected: 200 OK with {"results": [{"crmId": "...", "success": true}]} Note: Your CRM should store these custom engagement fields

Next Steps

Connect Your CRM

Once your implementation is complete, connect your CRM to Enginy