Enttor
Enttor API Docs
v1
Back to Enttor

Getting Started

The Enttor API lets you programmatically list team members, upload leads, and create DM campaigns across X (Twitter), Instagram, and LinkedIn.

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

All requests must include a valid API key via the Authorization header. Responses are JSON and follow a consistent envelope format.


Authentication

API keys are managed from the Settings → API Keys section of your Enttor dashboard. Each key is prefixed with ent_ and is shown only once at creation time.

Include the key in every request as a Bearer token:

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

Each key can be granted specific scopes that restrict what it can access:

FieldTypeRequiredDescription
leads:writescope
No
Upload leads to prospect groups
campaigns:writescope
No
Create DM campaigns
users:readscope
No
List team members

By default, newly created keys include all three scopes. You can restrict scopes when creating a key via the dashboard or the key creation endpoint.


List Users
GET

/api/v1/users

Retrieve all team members in your company. Use this to get valid user_ids for campaign distribution.

Example 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 a batch of leads into a new prospect group. Leads are processed in batches internally so there is no per-request cap.

Request Body
FieldTypeRequiredDescription
group_namestring
Yes
Name for the prospect group
platformstring
Yes
"x", "instagram", or "linkedin"
leadsarray
Yes
Array of lead objects
user_idnumber
No
Account ID to assign leads to (from List Users). If omitted, leads are unassigned.
Lead Object Fields

Common (all platforms)

FieldTypeRequiredDescription
usernamestring
Yes
Platform username / handle
profile_urlstring
No
Full URL to the profile
followersnumber
No
Follower count

X (Twitter) additional fields

FieldTypeRequiredDescription
companystring
No
Company name
company_descriptionstring
No
Company description
job_titlestring
No
Job title
locationstring
No
Geographic location

Instagram additional fields

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

LinkedIn additional fields

FieldTypeRequiredDescription
full_namestring
No
Full display name
headlinestring
No
LinkedIn headline
job_titlestring
No
Job title
companystring
No
Company name
locationstring
No
Geographic location
Example Request
{ "group_name": "Video editors", "platform": "instagram", "leads": [ { "username": "garyvee", "profile_url": "https://instagram.com/garyvee", "followers": 10200000, "contact_info": "team@vaynermedia.com", "content_pillars": ["entrepreneurship", "marketing"] }, { "username": "hormozi", "profile_url": "https://instagram.com/hormozi", "followers": 3100000 } ] }
Example 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

Retrieve all prospect datasets (groups) belonging to your company. Use the returned id as dataset_id when creating campaigns.

Example 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" } ] } }

Create Campaign
POST

/api/v1/campaigns

Create one or more DM campaigns targeting a previously uploaded prospect group. Pass user_ids to distribute leads across multiple team members. The start_date must be at least 10 minutes in the future.

Request Body
FieldTypeRequiredDescription
dataset_idstring
Yes
ID of the prospect group (from Upload Leads response)
campaign_namestring
Yes
Name for the campaign
platformstring
Yes
"x", "instagram", or "linkedin"
message_sequencestring
Yes
Message template to send to each prospect
start_datestring (ISO 8601)
Yes
Campaign start date (min 10 min from now)
end_datestring (ISO 8601)
Yes
Campaign end date
user_idsarray
Yes
Array of account IDs to distribute leads across (from List Users)
daily_message_limitnumber
No
Max messages per day per campaign. Defaults: instagram=50, x=200, linkedin=20
Example Request
{ "dataset_id": "317", "campaign_name": "Robinhood Followers Outreach", "platform": "instagram", "message_sequence": "Hey {{username}}, love your content! We help creators automate their outreach — 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 }
Example 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 distributed evenly across the provided user_ids. If the total is not perfectly divisible, the first user(s) receive one extra lead each.


Error Handling

All error responses follow a consistent format. The success field will be false and the error object contains a machine-readable code and a human-readable message.

{ "success": false, "error": { "code": "VALIDATION_ERROR", "message": "group_name is required" } }
Error Codes
CodeHTTP StatusDescription
UNAUTHORIZED401Missing or invalid API key
FORBIDDEN403API key lacks the required scope
VALIDATION_ERROR400Request body failed validation
NOT_FOUND404Resource does not exist or is not owned by your account
RATE_LIMITED429Too many requests — try again later
INTERNAL_ERROR500Unexpected server error

Enttor API v1 — Questions? Contact us at kgamez@enttor.ai