Enttor API Docs

Getting Started

The Enttor API lets you upload leads, create DM campaigns, and manage your team programmatically across X, Instagram, and LinkedIn.

Base URL

https://www.enttor.ai/api/v1

Every request requires an API key in the Authorization header. All responses return JSON.


Authentication

Create API keys from Settings → API Keys in your dashboard. Keys are prefixed with ent_ and shown only once.

curl -X GET https://www.enttor.ai/api/v1/users \ -H "Authorization: Bearer ent_your_api_key_here"
Scopes

Each key has scopes that control access. All three are included by default.

FieldTypeRequiredDescription
leads:writescope
No
Upload leads
campaigns:writescope
No
Create campaigns
users:readscope
No
List team members

List Users
GET

/api/v1/users

Returns all team members in your company. Use the id values as user_ids when creating campaigns.

Response 200
{ "success": true, "data": { "company_id": "1c5028af-0825-4fcc-97d5-991243aa38ff", "users": [ { "id": 1037, "name": "Kevin Gamez", "email": "kgamez@enttor.ai" }, { "id": 1001, "name": "Zinnie Zhang", "email": "zzhang@enttor.ai" }, { "id": 1036, "name": "Sameer", "email": "ssomani@enttor.ai" } ] } }

Upload Leads
POST

/api/v1/leads

Upload leads into a new prospect group. No per-request limit. Leads are batched internally.

Request Body
FieldTypeRequiredDescription
group_namestring
Yes
Name for the prospect group
platformstring
Yes
"x", "instagram", or "linkedin"
leadsarray
Yes
Array of lead objects (see fields below)
user_idnumber
No
Assign leads to this team member. Omit for unassigned.
Lead Fields

All platforms

FieldTypeRequiredDescription
usernamestring
Yes
Platform handle
profile_urlstring
No
Profile URL
followersnumber
No
Follower count

X (Twitter)

FieldTypeRequiredDescription
companystring
No
Company name
company_descriptionstring
No
What the company does
job_titlestring
No
Job title
locationstring
No
Location

Instagram

FieldTypeRequiredDescription
contact_infostring
No
Contact info from bio
content_pillarsarray
No
Content categories
user_infoobject
No
Extra metadata

LinkedIn

FieldTypeRequiredDescription
full_namestring
No
Full name
headlinestring
No
Headline
job_titlestring
No
Job title
companystring
No
Company name
locationstring
No
Location
Example
// POST /api/v1/leads { "group_name": "Video editors", "platform": "instagram", "user_id": 1037, "leads": [ { "username": "garyvee", "profile_url": "https://instagram.com/garyvee", "followers": 10200000, "contact_info": "team@vaynermedia.com" }, { "username": "hormozi", "followers": 3100000 } ] }
Response 201
{ "success": true, "data": { "dataset_id": "316", "group_name": "Video editors", "platform": "instagram", "leads_inserted": 2, "leads_skipped": 0 } }

List Datasets
GET

/api/v1/datasets

Returns all prospect groups for your company. Use the id as dataset_id when creating campaigns.

Response 200
{ "success": true, "data": { "company_id": "1c5028af-0825-4fcc-97d5-991243aa38ff", "datasets": [ { "id": "317", "user_id": 1001, "name": "robinhoodapp", "platform": "Instagram", "source": "platform", "status": "completed", "lead_count": "350", "created_at": "2026-02-06T12:50:12.205Z" }, { "id": "313", "user_id": 1037, "name": "SaaS Founders", "platform": "X (Twitter)", "source": "api", "status": "completed", "lead_count": "2500", "created_at": "2026-02-04T09:15:22.100Z" } ] } }

source is "api" for datasets created via this API, "platform" for datasets created from the dashboard.


Create Campaign
POST

/api/v1/campaigns

Create DM campaigns targeting a prospect group. Pass multiple user_ids to split leads across team members. start_date must be at least 10 minutes in the future.

Request Body
FieldTypeRequiredDescription
dataset_idstring
Yes
Prospect group ID (from Upload Leads or List Datasets)
campaign_namestring
Yes
Campaign name
platformstring
Yes
"x", "instagram", or "linkedin"
message_sequencestring
Yes
Message template sent to each prospect
start_dateISO 8601
Yes
Start date (min 10 min from now)
end_dateISO 8601
Yes
End date
user_idsnumber[]
Yes
Team member IDs to distribute leads across
daily_message_limitnumber
No
Max DMs/day per campaign. Defaults: IG=50, X=200, LI=20
Example
// POST /api/v1/campaigns { "dataset_id": "317", "campaign_name": "Robinhood Followers Outreach", "platform": "instagram", "message_sequence": "Hey {{username}}, love your content! Would love to show you how Enttor works.", "start_date": "2026-03-01T00:00:00Z", "end_date": "2026-03-31T23:59:59Z", "user_ids": [1037, 1001], "daily_message_limit": 40 }
Response 201
{ "success": true, "data": { "campaigns": [ { "campaign_id": 187, "user_id": 1037, "audience_size": 175 }, { "campaign_id": 188, "user_id": 1001, "audience_size": 175 } ], "campaign_name": "Robinhood Followers Outreach", "status": "scheduled", "dataset_id": "317", "total_audience": 350 } }

Leads are split evenly. If the total isn't divisible, the first user(s) get one extra each.


Campaign Status
GET

/api/v1/campaigns/status

Fetch campaign status and message delivery counts. Pass campaign_id for a single campaign, or client_id for all campaigns belonging to a team member. Supports filtering by status and platform.

Query Parameters
FieldTypeRequiredDescription
campaign_idstring
No
Single campaign ID. Returns one campaign object.
client_idstring
No
Team member ID. Returns all their campaigns.
statusstring
No
Filter by campaign status: "draft", "active", "scheduled", "paused", "completed", "cancelled"
platformstring
No
Filter by platform: "instagram", "linkedin", "twitter"

At least one of campaign_id or client_id is required. Filters only apply when using client_id.

Example
curl -X GET "https://www.enttor.ai/api/v1/campaigns/status?client_id=1001&status=completed" \ -H "Authorization: Bearer ent_your_api_key_here"
Response 200
{ "success": true, "data": { "campaigns": [ { "id": "197", "name": "fion3r Following List", "status": "completed", "platforms": ["instagram"], "startDate": "2026-02-14T19:30:49+00:00", "endDate": "2026-02-21T19:11:49+00:00", "dailyMessageLimit": 50, "createdAt": "2026-02-15T00:15:38.543+00:00", "messages": { "total": 172, "sent": 163, "failed": 9, "error": 0, "alreadyMessaged": 0, "repliedTo": 0 } } ] } }
Message Counts
FieldTypeRequiredDescription
totalnumber
No
Total messages created for this campaign
sentnumber
No
Messages successfully sent
failednumber
No
Messages that failed to deliver
errornumber
No
Messages that encountered an error
alreadyMessagednumber
No
Skipped because the user was already messaged
repliedTonumber
No
Messages where the recipient replied

Errors

All errors return success: false with a machine-readable code and a message.

{ "success": false, "error": { "code": "VALIDATION_ERROR", "message": "group_name is required" } }
CodeStatusMeaning
UNAUTHORIZED401Missing or invalid API key
FORBIDDEN403Key lacks the required scope
VALIDATION_ERROR400Bad request body
NOT_FOUND404Resource not found or not yours
RATE_LIMITED429Too many requests
INTERNAL_ERROR500Something went wrong on our end

Enttor API v1 — Questions? kgamez@enttor.ai