How requests are authenticated

The app key is the HTTP header name. The auth key is that header's value. There is no Authorization scheme, no Bearer token, and no Basic auth for API keys.

curl https://apiv2.entrancegrp.com/campaigns \ -H "EGKS*********: uvY4tvyE*************"

That sandbox key was checked against GET /campaigns. It returns 200 and a JSON object with records, lastId, totalRecords, and code.

When to include a workspace id

/workspaces/:workspaceId is only necessary when the account owns more than one workspace. With a single workspace, call the resource directly.

  • One workspace: GET /campaigns
  • More than one workspace: GET /workspaces/335/campaigns

Use the plural path /workspaces/:workspaceId. /workspace/:id is not a route. Leave the workspace id blank in the tester below and it drops that prefix for you.

Settings do not have a direct alias. Those calls stay on GET /workspaces/:workspaceId/settings.

The tester in this page cannot finish the call from another website. The API only allows the headers Content-Type, Authorization, syft-entrance-api-key, and workspace-id on a browser preflight, and the app key is a different header name. Use the curl the tester prints.

These GET paths perform the action rather than reporting it: campaign send, pause, resume, cancel, channel unclaim, and logout.

Try a request

The tester sends the app key as the header name and the auth key as the value. Paste your own keys. Examples below show only the prefix.

App key and auth key

Session access token

Email and password

Email login is a separate session flow. API key calls do not use it.

139

Total Endpoints

6

Categories

63

GET Endpoints

41

POST Endpoints

The sections below are in the order most integrations need them. Campaigns first, then the inbox. Every endpoint on this page is a real route. Calls that are not registered, still return 500, or only exist on localhost are not listed.

Campaigns

35 endpoints

Start here. Most integrations list campaigns, put contacts on one, then read progress.

Making a campaign

List with GET /campaigns. That is the same data as GET /workspaces/:workspaceId/campaigns when the account has one workspace. Create with POST /workspaces/:workspaceId/campaigns, then set the text with PATCH /campaigns/:id.

GET /campaigns
List Campaigns

Direct list. Add /workspaces/:workspaceId in front only when the account owns more than one workspace. Returns records, lastId, totalRecords, and code.

curl -X GET "https://apiv2.entrancegrp.com/campaigns" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/campaigns?order=DESC&limit=100&types=SINGLE_BLAST
Get All
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/campaigns?order=DESC&limit=100&types=SINGLE_BLAST" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/campaigns/:id
Get Campaign
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/campaigns/:id" \ -H "EGKS*********: uvY4tvyE*************"
POST /workspaces/:workspaceId/campaigns
Create Campaign
curl -X POST "https://apiv2.entrancegrp.com/workspaces/:workspaceId/campaigns" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "name": "Spring launch", "type": "SINGLE_BLAST", "text_message": "Hi John, this is a sample message.", "send_after_import": false }'
PATCH /campaigns/:id
Update Campaign
curl -X PATCH "https://apiv2.entrancegrp.com/campaigns/:id" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "media_url": null }'
POST /campaigns/:id/attach-media
Attach Media
curl -X POST "https://apiv2.entrancegrp.com/campaigns/:id/attach-media" \ -H "EGKS*********: uvY4tvyE*************"

Adding and removing contacts

Read the audience with GET /workspaces/:workspaceId/campaigns/:id/contacts. Add numbers with POST on that path. Remove them with POST /campaigns/:id/contacts/delete.

GET /workspaces/:id/campaigns/:campaignId/contacts?lastid=0&limit=20&order=ASC
Get Contacts
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:id/campaigns/:campaignId/contacts?lastid=0&limit=20&order=ASC" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:id/campaigns/:campaignId/campaign-contacts
Get Campaign Contacts
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:id/campaigns/:campaignId/campaign-contacts" \ -H "EGKS*********: uvY4tvyE*************"
POST /workspaces/:workspaceId/campaigns/:campaignId/contacts
Add Contacts
curl -X POST "https://apiv2.entrancegrp.com/workspaces/:workspaceId/campaigns/:campaignId/contacts" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "contacts": [ { "number": "+15555550100", "first_name": "John", "last_name": "Doe", "company": "Acme" }, { "number": "+15555550101", "first_name": "Jane", "last_name": "Doe", "company": "Acme" } ], "send_after_import": false }'
POST /campaigns/:campaignId/contacts/delete
Delete Uploaded Contacts
curl -X POST "https://apiv2.entrancegrp.com/campaigns/:campaignId/contacts/delete" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "field": "number", "value": [ "+15555550100" ] }'
GET /workspaces/:id/campaigns/:campaignId/contact-lists
Get Contact Lists
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:id/campaigns/:campaignId/contact-lists" \ -H "EGKS*********: uvY4tvyE*************"
POST /workspaces/:id/campaigns/:campaignId/contact-lists
Add Contact List
curl -X POST "https://apiv2.entrancegrp.com/workspaces/:id/campaigns/:campaignId/contact-lists" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "contact_list_id": 1 }'
DELETE /workspaces/:id/campaigns/:campaignId/contact-lists/:campaignContactListId
Remove Contact List by Record Id
curl -X DELETE "https://apiv2.entrancegrp.com/workspaces/:id/campaigns/:campaignId/contact-lists/:campaignContactListId" \ -H "EGKS*********: uvY4tvyE*************"

Permissions

See who can use a campaign with GET /campaigns/:id/permissions. Add a user or a group with the POST routes below. There is no route to delete a single user permission.

GET /campaigns/:id/permissions
Get Campaign Permissions
curl -X GET "https://apiv2.entrancegrp.com/campaigns/:id/permissions" \ -H "EGKS*********: uvY4tvyE*************"
POST /campaigns/:id/permissions/users
Add User
curl -X POST "https://apiv2.entrancegrp.com/campaigns/:id/permissions/users" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "user_id": 1 }'
POST /campaigns/:id/permissions/groups
Add User Group
curl -X POST "https://apiv2.entrancegrp.com/campaigns/:id/permissions/groups" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "user_group_id": 1 }'
DELETE /campaigns/:id/permissions
Clear Permissions
curl -X DELETE "https://apiv2.entrancegrp.com/campaigns/:id/permissions" \ -H "EGKS*********: uvY4tvyE*************"
DELETE /campaigns/:id/permissions/groups?user_group_id=1
Remove User Group
curl -X DELETE "https://apiv2.entrancegrp.com/campaigns/:id/permissions/groups?user_group_id=1" \ -H "EGKS*********: uvY4tvyE*************"

Sending and results

Do not use send, pause, resume, or cancel to check status. Those GETs perform the action. Progress is upload-progress and send-progress: HTTP 200 when a row exists, HTTP 404 when this campaign has not reached that step. Analytics summary is HTTP 200 even when those sections are null.

GET /workspaces/:workspaceId/campaigns/:campaignId/analytics-summary
Campaign Analytics Summary
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/campaigns/:campaignId/analytics-summary" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/campaigns/:id/upload-progress
getUploadProgress
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/campaigns/:id/upload-progress" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/campaigns/:id/send-progress
getSendProgress
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/campaigns/:id/send-progress" \ -H "EGKS*********: uvY4tvyE*************"
GET /campaigns/:campaignId/clicks
Get Campaign Clicks
curl -X GET "https://apiv2.entrancegrp.com/campaigns/:campaignId/clicks" \ -H "EGKS*********: uvY4tvyE*************"
POST /workspaces/:workspaceId/campaigns/:id/test
Send Test Message
curl -X POST "https://apiv2.entrancegrp.com/workspaces/:workspaceId/campaigns/:id/test" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "test_messages": [ { "number": "+15555550100", "variables": { "first_name": "John", "last_name": "Doe" } } ] }'
POST /workspaces/:workspaceId/campaigns/:campaignId/schedule
Schedule Campaign
curl -X POST "https://apiv2.entrancegrp.com/workspaces/:workspaceId/campaigns/:campaignId/schedule" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "schedule": "2025-08-21T08:00:00-05:00" }'
GET /workspaces/:workspaceId/campaigns/:campaignId/send
Send

This GET performs the action. It does not return status.

curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/campaigns/:campaignId/send" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/campaigns/:id/pause
Pause Campaign

This GET performs the action. It does not return status.

curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/campaigns/:id/pause" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/campaigns/:id/resume
Resume Campaign

This GET performs the action. It does not return status.

curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/campaigns/:id/resume" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/campaigns/:id/cancel
Cancel Campaign

This GET performs the action. It does not return status.

curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/campaigns/:id/cancel" \ -H "EGKS*********: uvY4tvyE*************"

Templates and text filters

Saved campaign copy and the text filters applied while uploading contacts.

GET /campaign-templates?last_id=9999999999999&limit=20&order=DESC
Get Campaign Templates
curl -X GET "https://apiv2.entrancegrp.com/campaign-templates?last_id=9999999999999&limit=20&order=DESC" \ -H "EGKS*********: uvY4tvyE*************"
GET /campaign-text-filters
Get Campaign Text Filters
curl -X GET "https://apiv2.entrancegrp.com/campaign-text-filters" \ -H "EGKS*********: uvY4tvyE*************"
POST /campaign-templates
Create Campaign Template
curl -X POST "https://apiv2.entrancegrp.com/campaign-templates" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "name": "Welcome", "text": "Hi John, this is a sample message." }'
PUT /campaign-templates/:id
Update Campaign Template
curl -X PUT "https://apiv2.entrancegrp.com/campaign-templates/:id" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "name": "Welcome" }'
DELETE /campaign-templates/:id
Delete Campaign Template
curl -X DELETE "https://apiv2.entrancegrp.com/campaign-templates/:id" \ -H "EGKS*********: uvY4tvyE*************"
POST /campaign-text-filters
Create Campaign Text Filter
curl -X POST "https://apiv2.entrancegrp.com/campaign-text-filters" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "text": "Hi John, this is a sample message." }'
DELETE /campaign-text-filters/:id
Delete Campaign Text Filter
curl -X DELETE "https://apiv2.entrancegrp.com/campaign-text-filters/:id" \ -H "EGKS*********: uvY4tvyE*************"

Messaging

26 endpoints

The inbox. Open a thread, read it, and send a reply.

Channels

Unclaimed threads are GET /channels?claimed=false. One thread is GET /workspaces/:workspaceId/channels/:id. Unclaim is a GET that releases the thread.

GET /channels?claimed=false
Track Click
curl -X GET "https://apiv2.entrancegrp.com/channels?claimed=false" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/channels?claimed=true
Get Channels
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/channels?claimed=true" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/channels/:id
Get Channel
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/channels/:id" \ -H "EGKS*********: uvY4tvyE*************"
PATCH /workspaces/:workspaceId/channels/:id
Update Channel
curl -X PATCH "https://apiv2.entrancegrp.com/workspaces/:workspaceId/channels/:id" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "assigned_to": 1 }'
DELETE /workspaces/:workspaceId/channels/:id/
Delete Channels
curl -X DELETE "https://apiv2.entrancegrp.com/workspaces/:workspaceId/channels/:id/" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/channels/:id/unclaim
Unclaim

This GET performs the action. It does not return status.

curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/channels/:id/unclaim" \ -H "EGKS*********: uvY4tvyE*************"
POST /workspaces/:workspaceId/channels/:id/assign
Assign
curl -X POST "https://apiv2.entrancegrp.com/workspaces/:workspaceId/channels/:id/assign" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "user_id": 1 }'
POST /workspaces/:workspaceId/channels/bulk-assign-flag
Bulk Flag Assign
curl -X POST "https://apiv2.entrancegrp.com/workspaces/:workspaceId/channels/bulk-assign-flag" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "flag_id": 1, "phoneNumbers": [ "+15555550100" ] }'
GET /workspaces/:workspaceId/channels/:id/meta?email=true
Get Channel Meta
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/channels/:id/meta?email=true" \ -H "EGKS*********: uvY4tvyE*************"
POST /workspaces/:workspaceId/channels/:id/create-shortlink
Create Channel Shortlink
curl -X POST "https://apiv2.entrancegrp.com/workspaces/:workspaceId/channels/:id/create-shortlink" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "redirect": "https://example.com/shortlink-destination" }'

Messages

History for one thread is GET /workspaces/:workspaceId/messages with channelid set to that channel. POST on the same path sends a reply.

GET /workspaces/:workspaceId/messages?channelid=&limit=100&ts=2024-01-15T12:00:00.000Z&order=ASC
Get
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/messages?channelid=&limit=100&ts=2024-01-15T12:00:00.000Z&order=ASC" \ -H "EGKS*********: uvY4tvyE*************"
POST /receive-sms/receive
Test Receive SMS Beta
curl -X POST "https://apiv2.entrancegrp.com/receive-sms/receive" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "data": { "payload": { "autoresponse_type": null, "cc": [], "completed_at": null, "cost": null, "direction": "inbound", "encoding": "GSM-7", "errors": [], "from": { "carrier": "Verizon Wireless", "line_type": "Wireless", "phone_number": "+15555550100" }, "id": "89e392e0-39d3-4561-82b1-93b58007f717", "is_spam": false, "media": [], "messaging_profile_id": "40018695-6da6-477a-a06d-6934e009e717", "organization_id": "c69dc7e5-664a-421b-a604-c1f7a8424722", "parts": 1, "received_at": "2023-06-08T22:18:03.279+00:00", "record_type": "message", "sent_at": null, "subject": "", "tags": [], "text": "start", "to": [ { "carrier": "Telnyx", "line_type": "Wireless", "phone_number": "+15555550100", "status": "webhook_delivered" } ], "type": "SMS", "valid_until": null, "webhook_failover_url": null, "webhook_url": "https://example.com/webhooks/inbound-sms" } } }'
POST /workspaces/:workspaceId/messages
Send Message
curl -X POST "https://apiv2.entrancegrp.com/workspaces/:workspaceId/messages" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "channel_id": 1, "message": "Hi John, this is a sample message." }'

Keywords, stops, and templates

Words that trigger an action, unsubscribe filters, and reusable reply text.

GET /incoming-message-keywords
Get Keywords
curl -X GET "https://apiv2.entrancegrp.com/incoming-message-keywords" \ -H "EGKS*********: uvY4tvyE*************"
GET /message-filters?unsubscribe=true
Get Filter
curl -X GET "https://apiv2.entrancegrp.com/message-filters?unsubscribe=true" \ -H "EGKS*********: uvY4tvyE*************"
GET /message-templates?limit=1
Get Message Templates
curl -X GET "https://apiv2.entrancegrp.com/message-templates?limit=1" \ -H "EGKS*********: uvY4tvyE*************"
POST /incoming-message-keywords
Add Keyword
curl -X POST "https://apiv2.entrancegrp.com/incoming-message-keywords" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "keyword": "hello" }'
DELETE /incoming-message-keywords?keyword=hello
Delete Keyword
curl -X DELETE "https://apiv2.entrancegrp.com/incoming-message-keywords?keyword=hello" \ -H "EGKS*********: uvY4tvyE*************"
POST /message-filters
Add Filter
curl -X POST "https://apiv2.entrancegrp.com/message-filters" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "phrase": "stop", "contains": false, "unsubscribe": true }'
PATCH /message-filters/:messageFilterId
Update Filter
curl -X PATCH "https://apiv2.entrancegrp.com/message-filters/:messageFilterId" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "phrase": "hello", "contains": true, "unsubscribe": false }'
DELETE /message-filters/:messageFilterId
Delete Filter
curl -X DELETE "https://apiv2.entrancegrp.com/message-filters/:messageFilterId" \ -H "EGKS*********: uvY4tvyE*************"
POST /message-templates
Create Message Template
curl -X POST "https://apiv2.entrancegrp.com/message-templates" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "name": "Welcome", "text": "Hi John, this is a sample message." }'
PATCH /message-templates/:id
Update Message Template
curl -X PATCH "https://apiv2.entrancegrp.com/message-templates/:id" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "text": "Hi John, this is a sample message." }'
DELETE /message-templates/:id
Delete Message Template
curl -X DELETE "https://apiv2.entrancegrp.com/message-templates/:id" \ -H "EGKS*********: uvY4tvyE*************"
PATCH /workspaces/:id/message-filters/:id
Update Filter
curl -X PATCH "https://apiv2.entrancegrp.com/workspaces/:id/message-filters/:id" \ -H "EGKS*********: uvY4tvyE*************"
DELETE /workspaces/:id/message-filters/:id
Delete Filter
curl -X DELETE "https://apiv2.entrancegrp.com/workspaces/:id/message-filters/:id" \ -H "EGKS*********: uvY4tvyE*************"

Contacts

25 endpoints

People, the lists they sit on, and numbers you will not message.

People

Search the workspace address book. This is not the list of people already attached to a campaign.

GET /workspaces/:workspaceId/contacts/:contactId
Get Contact
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/contacts/:contactId" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/contacts?limit=300&order=ASC
Get Contacts
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/contacts?limit=300&order=ASC" \ -H "EGKS*********: uvY4tvyE*************"
POST /contacts
Create Contact
curl -X POST "https://apiv2.entrancegrp.com/contacts" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "number": "+15555550100" }'
PATCH /workspaces/:workspaceId/contacts/:id
Update Contact
curl -X PATCH "https://apiv2.entrancegrp.com/workspaces/:workspaceId/contacts/:id" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "stop": "true" }'

Contact lists

A list is a saved audience you can attach to a campaign. A missing list id returns 404.

GET /workspaces/:workspaceId/contact-lists/:id/contacts?lastid=0&limit=100&order=ASC
Get Contacts in List
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/contact-lists/:id/contacts?lastid=0&limit=100&order=ASC" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/contact-lists/:id/imports?lastid=0&order=ASC&limit=100
Get Contact List Imports
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/contact-lists/:id/imports?lastid=0&order=ASC&limit=100" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/contact-lists/:id?lastid=2&limit=100&order=ASC
Get Contact List By Id
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/contact-lists/:id?lastid=2&limit=100&order=ASC" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/contact-lists/imports/:importId/contacts?lastId=0&order=ASC&limit=100
Get Contacts By Import
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/contact-lists/imports/:importId/contacts?lastId=0&order=ASC&limit=100" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/contact-lists?limit=100&order=ASC
Get All Contact Lists
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/contact-lists?limit=100&order=ASC" \ -H "EGKS*********: uvY4tvyE*************"
POST /workspaces/:workspaceId/contact-lists
Create Contact List
curl -X POST "https://apiv2.entrancegrp.com/workspaces/:workspaceId/contact-lists" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "name": "Spring list" }'
POST /workspaces/:workspaceId/contact-lists/:contactListId/imports
Import By Json Body
curl -X POST "https://apiv2.entrancegrp.com/workspaces/:workspaceId/contact-lists/:contactListId/imports" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "import_name": "Spring import", "contacts": [ { "number": "+15555550100", "first_name": "John", "last_name": "Doe", "company": "Acme" }, { "First": "Jane", "Last": "Doe", "company": "Acme", "message": "Hi Jane, this is a sample message.", "number2": "+15555550101" } ] }'
PATCH /workspaces/:workspaceId/contact-lists/:id
Update Contact List By Id
curl -X PATCH "https://apiv2.entrancegrp.com/workspaces/:workspaceId/contact-lists/:id" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "name": "Spring list" }'
PATCH /workspaces/:workspaceId/contact-lists/imports/:id
Update Import
curl -X PATCH "https://apiv2.entrancegrp.com/workspaces/:workspaceId/contact-lists/imports/:id" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "archive": true }'

Flags, blocks, and shortlists

Flags label threads. Blocked numbers are never messaged. Shortlists are the small working set for a user.

POST /flags
Create Flag
curl -X POST "https://apiv2.entrancegrp.com/flags" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "name": "VIP", "color_id": "#111111" }'
DELETE /flags/:flagId
Remove Flag
curl -X DELETE "https://apiv2.entrancegrp.com/flags/:flagId" \ -H "EGKS*********: uvY4tvyE*************"
PATCH /flags/:flagId
Update Flag
curl -X PATCH "https://apiv2.entrancegrp.com/flags/:flagId" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "name": "VIP", "color_id": "#f1f1f1" }'
GET /flags?lastid=9999999999&order=DESC
Get All Workspace Flags
curl -X GET "https://apiv2.entrancegrp.com/flags?lastid=9999999999&order=DESC" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:id/flags/:flagId
Get Flag By Id
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:id/flags/:flagId" \ -H "EGKS*********: uvY4tvyE*************"
POST /workspace-blocked-numbers
Add Number
curl -X POST "https://apiv2.entrancegrp.com/workspace-blocked-numbers" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "number": "+15555550100" }'
DELETE /workspace-blocked-numbers/3
Delete Number
curl -X DELETE "https://apiv2.entrancegrp.com/workspace-blocked-numbers/3" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspace-blocked-numbers/:id
Get Number by Id
curl -X GET "https://apiv2.entrancegrp.com/workspace-blocked-numbers/:id" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspace-blocked-numbers?lastid=0&limit=20&order=ASC
Get Numbers
curl -X GET "https://apiv2.entrancegrp.com/workspace-blocked-numbers?lastid=0&limit=20&order=ASC" \ -H "EGKS*********: uvY4tvyE*************"
GET /shortlists
Get Shortlist Contacts
curl -X GET "https://apiv2.entrancegrp.com/shortlists" \ -H "EGKS*********: uvY4tvyE*************"
POST /shortlists
Add Shortlist Contact
curl -X POST "https://apiv2.entrancegrp.com/shortlists" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "contact_id": 1 }'
DELETE /shortlists/:shortlistId
Remove Shortlist Contact
curl -X DELETE "https://apiv2.entrancegrp.com/shortlists/:shortlistId" \ -H "EGKS*********: uvY4tvyE*************"

Workspaces

13 endpoints

Which workspace you are in, its settings, and who can use it.

Your workspace

GET /workspaces lists what this key can see. Settings only exist at GET /workspaces/:workspaceId/settings. Daily stats are the dashboard counts.

GET /workspaces
Get Workspaces
curl -X GET "https://apiv2.entrancegrp.com/workspaces" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId
Get Workspace
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId" \ -H "EGKS*********: uvY4tvyE*************"
POST /workspaces
Create Workspace
curl -X POST "https://apiv2.entrancegrp.com/workspaces" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "organization_name": "Example workspace", "country_code": "US", "webhook": { "name": "Example webhook", "url": "https://example.com/webhooks/workspace-events", "subscriptions": [ "campaignCreated", "campaignSent", "messageStatus", "newMessage", "shortlinkClick", "campaignSending" ] } }'
GET /workspaces/:workspaceId/permission
Get Workspace Permission
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/permission" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/settings
Get All Settings
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/settings" \ -H "EGKS*********: uvY4tvyE*************"
PUT /workspaces/:workspaceId/settings
Update Setting
curl -X PUT "https://apiv2.entrancegrp.com/workspaces/:workspaceId/settings" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "channel_locking": true }'
GET /analytics/daily-stats
Get Daily Stats For Dashboard
curl -X GET "https://apiv2.entrancegrp.com/analytics/daily-stats" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/daily-analytics
Daily Analytics
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/daily-analytics" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspace-logs?lastid=0&limit=999&order=ASC
Get Logs
curl -X GET "https://apiv2.entrancegrp.com/workspace-logs?lastid=0&limit=999&order=ASC" \ -H "EGKS*********: uvY4tvyE*************"

Who has access

Assign a user to this workspace, or list who is already assigned.

GET /workspaces/:id/assigned
Get Workspace Users
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:id/assigned" \ -H "EGKS*********: uvY4tvyE*************"
POST /workspaces/:workspaceId/assign
Assign User To Workspace
curl -X POST "https://apiv2.entrancegrp.com/workspaces/:workspaceId/assign" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "user_id": 1, "permission": "user" }'
PATCH /workspaces/:workspaceId/assigned/:userId
Update User Assign Permission
curl -X PATCH "https://apiv2.entrancegrp.com/workspaces/:workspaceId/assigned/:userId" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "permission": "senior" }'
DELETE /workspaces/:workspaceId/assigned/:userId
Delete User Assignment
curl -X DELETE "https://apiv2.entrancegrp.com/workspaces/:workspaceId/assigned/:userId" \ -H "EGKS*********: uvY4tvyE*************"

Automation

12 endpoints

Webhooks and subscriber lists, after campaigns and the inbox are working.

Webhooks

Subscribe this workspace to events such as newMessage. GET /webhooks/events lists the event names.

GET /webhooks
Get All Webhooks
curl -X GET "https://apiv2.entrancegrp.com/webhooks" \ -H "EGKS*********: uvY4tvyE*************"
GET /webhooks/events
Get Events
curl -X GET "https://apiv2.entrancegrp.com/webhooks/events" \ -H "EGKS*********: uvY4tvyE*************"
GET /webhooks/test
Test Get
curl -X GET "https://apiv2.entrancegrp.com/webhooks/test" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/webhooks/:webhookId
Get Webhook
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/webhooks/:webhookId" \ -H "EGKS*********: uvY4tvyE*************"
POST /webhooks
Create Webhook
curl -X POST "https://apiv2.entrancegrp.com/webhooks" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "name": "Example webhook", "url": "https://example.com/webhooks/new-message", "subscriptions": [ "newMessage" ] }'
DELETE /workspaces/:workspaceId/webhooks/:webhookId
Delete Webhook
curl -X DELETE "https://apiv2.entrancegrp.com/workspaces/:workspaceId/webhooks/:webhookId" \ -H "EGKS*********: uvY4tvyE*************"
POST /workspaces/:workspaceId/webhooks/:webhookId/subscribe
Subscribe To Events
curl -X POST "https://apiv2.entrancegrp.com/workspaces/:workspaceId/webhooks/:webhookId/subscribe" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "subscriptions": [ "messageStatus", "newMessage" ] }'
POST /workspaces/:workspaceId/webhooks/:webhookId/unsubscribe
Unsubscribe From Events
curl -X POST "https://apiv2.entrancegrp.com/workspaces/:workspaceId/webhooks/:webhookId/unsubscribe" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "subscriptions": [ "shortlinkClick" ] }'

Subscriber lists

List, create, and update opt-in lists. Fetching one list by id currently returns 500, so use the collection.

GET /subscriber-lists?last_id=9999999999999&limit=20&order=DESC&is_influencer_list=true
Get Subscriber Lists
curl -X GET "https://apiv2.entrancegrp.com/subscriber-lists?last_id=9999999999999&limit=20&order=DESC&is_influencer_list=true" \ -H "EGKS*********: uvY4tvyE*************"
POST /subscriber-lists
Create Subscriber List
curl -X POST "https://apiv2.entrancegrp.com/subscriber-lists" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "name": "Spring list", "isInfluencerList": true }'
PUT /subscriber-lists/:subscriberListId
Update Subscriber List
curl -X PUT "https://apiv2.entrancegrp.com/subscriber-lists/:subscriberListId" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "name": "Spring list", "private": true, "archive": true }'
DELETE /subscriber-lists/:subscriberListId
Delete Subscriber List
curl -X DELETE "https://apiv2.entrancegrp.com/subscriber-lists/:subscriberListId" \ -H "EGKS*********: uvY4tvyE*************"

Account

28 endpoints

Users, API keys, phone numbers, and sign-in. Most API-key integrations skip this.

Sign in

API keys do not use these routes. Email login returns a session token. Logout ends that session.

POST /authentication/login
Login
curl -X POST "https://apiv2.entrancegrp.com/authentication/login" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "email": "[email protected]", "password": "example-password" }'
GET /authentication/logout
Logout

This GET ends the session.

curl -X GET "https://apiv2.entrancegrp.com/authentication/logout" \ -H "EGKS*********: uvY4tvyE*************"
POST /authentication/refresh-token
Refresh Token
curl -X POST "https://apiv2.entrancegrp.com/authentication/refresh-token" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "client_id": "example-client-id", "refresh_token": "example-refresh-token" }'

Users and groups

People who can log into the workspace, and the groups used by campaign permissions.

GET /user-groups/:userGroupId
Get User Group
curl -X GET "https://apiv2.entrancegrp.com/user-groups/:userGroupId" \ -H "EGKS*********: uvY4tvyE*************"
GET /user-groups/:userGroupId/users
Get Users in Group
curl -X GET "https://apiv2.entrancegrp.com/user-groups/:userGroupId/users" \ -H "EGKS*********: uvY4tvyE*************"
GET /user-groups?lastid=9999999999&limit=20&order=DESC
Get User Groups
curl -X GET "https://apiv2.entrancegrp.com/user-groups?lastid=9999999999&limit=20&order=DESC" \ -H "EGKS*********: uvY4tvyE*************"
GET /users/:id
Get User
curl -X GET "https://apiv2.entrancegrp.com/users/:id" \ -H "EGKS*********: uvY4tvyE*************"
GET /users?last_id=9999999999999&limit=20&order=DESC
Get All Workspace Users
curl -X GET "https://apiv2.entrancegrp.com/users?last_id=9999999999999&limit=20&order=DESC" \ -H "EGKS*********: uvY4tvyE*************"
POST /user-groups
Create User Group
curl -X POST "https://apiv2.entrancegrp.com/user-groups" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "name": "Support" }'
PATCH /user-groups/:id
Update User Group
curl -X PATCH "https://apiv2.entrancegrp.com/user-groups/:id" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "name": "Support" }'
DELETE /user-groups/:id
Delete User Group
curl -X DELETE "https://apiv2.entrancegrp.com/user-groups/:id" \ -H "EGKS*********: uvY4tvyE*************"
POST /user-groups/:userGroupId/users
Add User To User Group
curl -X POST "https://apiv2.entrancegrp.com/user-groups/:userGroupId/users" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "user_id": 1 }'
DELETE /user-groups/:userGroupId/users/:userId
Remove User From User Group
curl -X DELETE "https://apiv2.entrancegrp.com/user-groups/:userGroupId/users/:userId" \ -H "EGKS*********: uvY4tvyE*************"
POST /users
Add Workspace User
curl -X POST "https://apiv2.entrancegrp.com/users" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "email": "[email protected]", "firstname": "John", "lastname": "Doe", "phoneNumber": "+15555550100" }'
PATCH /users/1
Update User
curl -X PATCH "https://apiv2.entrancegrp.com/users/1" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "exclude_from_campaigns": true }'
DELETE /users/:id?reassign=5
Delete Workspace User
curl -X DELETE "https://apiv2.entrancegrp.com/users/:id?reassign=5" \ -H "EGKS*********: uvY4tvyE*************"
POST /users/push-token
Add Push Token
curl -X POST "https://apiv2.entrancegrp.com/users/push-token" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "token": "ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]" }'

API keys and billing

Keys for other users, and usage for this workspace.

GET /billing/usage
Get Usage
curl -X GET "https://apiv2.entrancegrp.com/billing/usage" \ -H "EGKS*********: uvY4tvyE*************"
GET /user-api-keys/12345
Get User Api Key
curl -X GET "https://apiv2.entrancegrp.com/user-api-keys/12345" \ -H "EGKS*********: uvY4tvyE*************"
DELETE /user-api-keys/:id
Delete User Api Key
curl -X DELETE "https://apiv2.entrancegrp.com/user-api-keys/:id" \ -H "EGKS*********: uvY4tvyE*************"
POST /user-api-keys/:id/refresh
Update User Api Key
curl -X POST "https://apiv2.entrancegrp.com/user-api-keys/:id/refresh" \ -H "EGKS*********: uvY4tvyE*************"
GET /user-api-keys?last_id=9999999999999&limit=20&order=DESC
Get User Api Keys in Workspace
curl -X GET "https://apiv2.entrancegrp.com/user-api-keys?last_id=9999999999999&limit=20&order=DESC" \ -H "EGKS*********: uvY4tvyE*************"
POST https://apiv2.entrancegrp.com/user-api-keys
Create User Api Key
curl -X POST "https://apiv2.entrancegrp.comhttps://apiv2.entrancegrp.com/user-api-keys" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "user_id": 1 }'

Phone numbers

Order numbers and inspect number pools.

POST /number-order-requests
Create Number Order Request
curl -X POST "https://apiv2.entrancegrp.com/number-order-requests" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "state": "Michigan", "count": 1 }'
GET /number-order-requests/:id
Get Number Order Request
curl -X GET "https://apiv2.entrancegrp.com/number-order-requests/:id" \ -H "EGKS*********: uvY4tvyE*************"
GET /number-order-requests?last_id=99999999&order=DESC&limit=10
Get All Number Order Requests
curl -X GET "https://apiv2.entrancegrp.com/number-order-requests?last_id=99999999&order=DESC&limit=10" \ -H "EGKS*********: uvY4tvyE*************"
POST /number-pools
Create
curl -X POST "https://apiv2.entrancegrp.com/number-pools" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "name": "Example profile" }'
GET /number-pools/:id
Get By Id
curl -X GET "https://apiv2.entrancegrp.com/number-pools/:id" \ -H "EGKS*********: uvY4tvyE*************"

Node.js Module Usage

Installation

npm install entrancesms

Call the API

Pass the app key as the header name and the auth key as the value. Omit /workspaces/:workspaceId when the account has one workspace.

const appKey = 'EGKS*********'; const authKey = 'uvY4tvyE*************'; const response = await fetch('https://apiv2.entrancegrp.com/campaigns', { headers: { [appKey]: authKey } }); const body = await response.json();

Quick Start Guide

Base URL: https://apiv2.entrancegrp.com

Header name = app key. Header value = auth key. Do not send Authorization: Bearer for API key calls.

curl https://apiv2.entrancegrp.com/campaigns \ -H "EGKS*********: uvY4tvyE*************"

Workspaces

/workspaces/:workspaceId is only necessary when the account owns more than one workspace. Otherwise hit the endpoint directly, for example GET /campaigns instead of GET /workspaces/335/campaigns.

Page through lists with lastid set to the id of the last record you received, plus limit and order.