Skip to main content
Important: This section describes the API endpoints that your system must implement to integrate with Enginy. These are not Enginy API endpoints — they are the interface specification that Enginy will call on your CRM.

Introduction

To integrate your custom CRM with Enginy, your system must expose a set of HTTP endpoints that Enginy will call. This documentation covers the exact specification your API must follow.
All endpoints must be accessible via HTTPS and accept the API key header you configured during connection setup.

Required Endpoints

Your Custom CRM integration supports three main use cases:

Data Export & Sync

Export contacts and companies from Enginy to your CRM, and sync data bidirectionally.
EndpointMethodPurpose
/healthGETConnection validation
/contactsPOSTBatch create contacts
/contacts/syncPOSTFind existing contacts, return CRM IDs and properties
/contactsPUTUpdate contacts (including engagement fields)
/companiesPOSTBatch create companies
/companies/syncPOSTFind existing companies, return CRM IDs and properties
/companiesPUTUpdate companies (including engagement fields)
/associationsPOSTLink contacts to companies
Log all conversation activity (messages, emails, connection requests) from campaigns.
EndpointMethodPurpose
/activitiesPOSTCreate activity record (LinkedIn message, email, etc.)
Activity Types:
  • EMAIL - Email messages sent/received
  • LINKEDIN - LinkedIn messages sent/received
  • LINKEDIN_INMAIL - LinkedIn InMail sent/received
  • LINKEDIN_CONNECTION - Connection requests sent/accepted
Create and manage tasks triggered by campaign sequences.
EndpointMethodPurpose
/tasksPOSTCreate a task
/tasks/:idGETGet a task
/tasks/:idPATCHUpdate/complete a task
/tasks/batchPOSTGet multiple tasks
/tasks/batchPATCHComplete multiple tasks
Provide a list of users for owner assignment in exports, tasks, and activities.
EndpointMethodPurpose
/usersGETList users/owners for assignment
Optional: If not implemented (returns 404/501/405), owner selection is disabled in the UI.

Quick Reference Cards


Authentication

Your API must validate the API key sent in the header you specified during setup (default: X-API-Key).
# Enginy will send requests like this:
POST /contacts HTTP/1.1
Host: your-api.com
X-API-Key: your-configured-secret
Content-Type: application/json
Accept: application/json
Return 401 Unauthorized if the API key is invalid or missing.

Health Endpoint

Your Implementation Required

This endpoint must be implemented on your server
Enginy calls this endpoint to validate the connection during setup and periodic health checks.
GET /health
Return any 2xx status code to indicate your API is healthy:
{
  "status": "ok"
}

Complete Endpoint Reference

Data Export & Sync

EndpointMethodPurposeDetails
/healthGETConnection validationReturn 200 if healthy
/contactsPOSTBatch create contactsView docs
/contacts/syncPOSTSync contacts (find existing)View docs
/contactsPUTUpdate contactsView docs
/companiesPOSTBatch create companiesView docs
/companies/syncPOSTSync companies (find existing)View docs
/companiesPUTUpdate companiesView docs
/associationsPOSTLink contacts to companiesView docs

Campaign Activity

EndpointMethodPurposeDetails
/activitiesPOSTCreate activity recordView docs

Tasks

EndpointMethodPurposeDetails
/tasksPOSTCreate a taskView docs
/tasks/:idGETGet a taskView docs
/tasks/:idPATCHUpdate a taskView docs
/tasks/batchPOSTGet tasks in batchView docs
/tasks/batchPATCHComplete tasks in batchView docs

Users (Optional)

EndpointMethodPurposeDetails
/usersGETList users/ownersView docs
The Users endpoint is optional. If not implemented, return 404, 501, or 405 to gracefully disable owner selection in the UI.

Data Flows

Export Flow

When exporting data from Enginy to your CRM, sync endpoints are always called first to identify existing records. Based on the sync results, Enginy will either create new records or update existing ones:
  • New records: If a contact/company is not found during sync (no crmId returned), it will be created via POST /contacts or POST /companies
  • Existing records: If a contact/company already exists in your CRM (a crmId is returned from sync), it will be updated via PUT /contacts or PUT /companies
Important: The /contacts/sync and /companies/sync endpoints are required. Enginy always calls them first to determine which records already exist in your CRM, then routes each record to either an update (PUT) or create (POST) operation accordingly.

Sync Endpoint Behavior

The sync endpoints (POST /contacts/sync and POST /companies/sync) allow Enginy to:
  1. Find existing records - Your CRM matches by email, LinkedIn URL, domain, etc.
  2. Return CRM IDs - So Enginy can link records for future updates
  3. Sync properties back - Optionally return data to update in Enginy
Key Principle: All matching logic lives in YOUR CRM. You decide how to identify existing records and what properties to sync back.
Minimal Implementation: If you don’t need matching logic, your sync endpoints can return an empty array { results: [] }. This will treat all records as new and proceed to create them.

Campaign Activity Flow

When a campaign sends messages or receives replies:

Engagement Field Updates

When contacts engage with campaigns (reply, click, connect), Enginy updates your CRM via PUT /contacts with fields like:
FieldExample ValueDescription
campaignEngagementStatusMessage Replied (2/3) - LINKEDINCurrent engagement status
campaignSequenceStatusOngoingNot Started, Ongoing, Finished, Replied
campaignOpens5Number of email opens
campaignClicks2Number of link clicks
activitiesConnection Request Sent, Message SentActivity log
Field names are user-configurable in Enginy. Your CRM should accept any field name and store it appropriately.
Engagement field updates are sent through PUT /contacts and PUT /companies using the mappings you configure in Enginy (e.g., last engaged date).

Enginy can generate clickable links to open records in your CRM:
ConfigurationExample
contactLinkTemplatehttps://mycrm.com/contacts/{{crmId}}
companyLinkTemplatehttps://mycrm.com/companies/{{crmId}}

Error Handling

Return appropriate HTTP status codes:
Status CodeWhen to Use
200 / 201Success
400Invalid request
401Invalid API key
404Resource not found
500Server error

Reference Implementation

GitHub Repository

Clone our complete working example: Node.js/Express server with SQLite, including all endpoints and a web dashboard for viewing data.