How requests are authenticated

The app key is the HTTP header name and the auth key is that header's value. The same pair is also accepted as HTTP Basic: the app key is the username and the auth key is the password. Authorization: Bearer is only a login session.

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

The first form is what existing clients send. -u is the same pair as HTTP Basic, which is what this page sends. A successful call 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.

This page sends Authorization: Basic. The browser is allowed to send that header. Keys stay in the fields above until you leave the page.

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

Try a request

Paste your own keys. They are used for the request on this page and are not stored.

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.

135

Total Endpoints

6

Categories

60

GET Endpoints

40

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. Put text_message on the create. That is the copy that sends. SINGLE_BLAST waits for contacts and a send call. MANUAL takes numbers on that same create and sends by itself.

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.

Sample response

{
  "code": 200,
  "lastId": 617961,
  "totalRecords": 20,
  "records": [
    {
      "id": 1243480,
      "name": "test",
      "text_message": "Hi John, this is a sample message.",
      "workspace_id": "335",
      "retarget_campaign_id": null,
      "manual_user_id": null,
      "nation_builder_list_id": null,
      "number_lookup_id": null,
      "ai_message_list_id": null,
      "force_mms": false,
      "personal_id": null,
      "type": "SINGLE_BLAST",
      "status": "created",
      "active": false,
      "archive": false,
      "approval_required": false,
      "approved": null,
      "total_contacts": 0,
      "flag_id": null,
      "media_url": null,
      "sent_at": null,
      "created_at": "2026-08-11T20:14:53.242Z",
      "delivered": 0,
      "undelivered": 0,
      "failed": 0,
      "rejected": 0,
      "invalid_numbers": 0,
      "sent": 0,
      "queued": 0,
      "response": 0,
      "stop": 0,
      "spam": 0,
      "total_segments": 0,
      "created_by": "David Barnathan",
      "subscriber_list_name": null
    }
  ]
}
curl -X GET "https://apiv2.entrancegrp.com/campaigns" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/campaigns?order=DESC&limit=100&types=SINGLE_BLAST
Get All

Sample response

{
  "code": 200,
  "lastId": 1233189,
  "totalRecords": 2,
  "records": [
    {
      "id": 1243480,
      "name": "test",
      "text_message": "Hi John, this is a sample message.",
      "workspace_id": "335",
      "retarget_campaign_id": null,
      "manual_user_id": null,
      "nation_builder_list_id": null,
      "number_lookup_id": null,
      "ai_message_list_id": null,
      "force_mms": false,
      "personal_id": null,
      "type": "SINGLE_BLAST",
      "status": "created",
      "active": false,
      "archive": false,
      "approval_required": false,
      "approved": null,
      "total_contacts": 0,
      "flag_id": null,
      "media_url": null,
      "sent_at": null,
      "created_at": "2026-08-11T20:14:53.242Z",
      "delivered": 0,
      "undelivered": 0,
      "failed": 0,
      "rejected": 0,
      "invalid_numbers": 0,
      "sent": 0,
      "queued": 0,
      "response": 0,
      "stop": 0,
      "spam": 0,
      "total_segments": 0,
      "created_by": "David Barnathan",
      "subscriber_list_name": null
    }
  ]
}
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

Sample response

{
  "code": 200,
  "record": {
    "id": 1243480,
    "workspace_id": "335",
    "subscriber_list_id": null,
    "retarget_campaign_id": null,
    "manual_user_id": null,
    "personal_id": null,
    "name": "test",
    "type": "SINGLE_BLAST",
    "status": "created",
    "active": false,
    "archive": false,
    "delete": false,
    "approval_required": false,
    "filter_against_master": false,
    "text_message": "Hi John, this is a sample message.",
    "total_contacts": 0,
    "added_numbers": false,
    "variables": null,
    "delivered": 0,
    "undelivered": 0,
    "failed": 0,
    "rejected": 0,
    "invalid_numbers": 0,
    "sent": 0,
    "queued": 0,
    "response": 0,
    "stop": 0,
    "spam": 0,
    "total_segments": 0,
    "shortlink_clicks": 0,
    "added_user_groups": null,
    "forward_number": null,
    "add_stop_message": false,
    "approved": null,
    "number_lookup_id": null,
    "disable_claims": false,
    "line_types": null,
    "filter_against_channels": false,
    "flag_id": null,
    "media_url": null,
    "media_preview_url": null,
    "ai_message_list_id": null,
    "ntrn_link": null,
    "force_mms": false,
    "retarget_skip_clicked_links": false,
    "auto_response_on_yes": null,
    "is_adjusted_time_zone": false,
    "override_channel_claim": false,
    "number_pool_id": null,
    "use_test_variables": false,
    "sent_at": null,
    "created_at": "2026-08-11T20:14:53.242Z",
    "updated_at": "2026-08-11T20:14:53.242Z",
    "scheduled_at": "2026-08-11T20:14:53.242Z",
    "nation_builder_list_name": null,
    "flag_summary": []
  }
}
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/campaigns/:id" \ -H "EGKS*********: uvY4tvyE*************"
POST /workspaces/:workspaceId/campaigns
Create Campaign

Required: name and type. text_message is the copy that sends, up to 1600 characters. A MANUAL create also requires numbers and then sends on its own.

  • type is SINGLE_BLAST, PERSONAL, RETARGET, BURST, SCHEDULED, SUBSCRIBER, MANUAL, or HOOK. All caps.
  • numbers is required for MANUAL. Digits only, country code first, no plus: 15555550100. A 10-digit number is stored with a leading 1.

Optional fields

  • manual_user_id assigns the manual campaign. It defaults to the caller. A user permission can only create MANUAL.
  • personal_id is the user for a PERSONAL campaign. It defaults to the caller. That user has to be allowed to send personal campaigns.
  • retarget_campaign_id copies a campaign that has already been sent and forces type RETARGET.
  • subscriber_list_id sends to one subscriber list. is_all_subscriber_lists sends to every list in the workspace. Do not send both.
  • number_lookup_id limits the audience to wireless numbers. flag_id stores a flag on the campaign.
  • ntrn_link is a tracked link, max 512 characters. shortlink is the same field. media_url is downloaded and the send goes out as MMS.
  • send_after_import starts the send when the contact upload finishes. MANUAL always turns this on.
  • override_channel_claim takes a thread another user has claimed. Default is false.
  • permissions false, or remove_all_permissions false, skips adding workspace users to the campaign. include_excluded_users adds users who are otherwise left off that list.
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." }'
PATCH /campaigns/:id
Update Campaign

Every field is optional. Only the fields you send are written. text_message here changes the copy. It is not required to set the copy the first time.

Optional fields

  • name and text_message (1 to 1600 characters). If the campaign is already sending or sent, a new text_message clears the prepared contacts and resets spam and carrier progress. A campaign with sender ids must keep {{sender_id}} in the text.
  • media_url is a file URL, or null. The file is stored and the send is MMS. force_mms sends as MMS even without a new file.
  • archive and delete mark the campaign.
  • filter_against_master skips people this workspace has already messaged. filter_against_channels skips numbers that already have a channel.
  • add_stop_message appends "Reply STOP to Opt-Out" at send time. A workspace that requires opt-out will not let you turn this off.
  • forward_number is where calls on replies go, 10 digits. disable_claims stops the campaign from claiming the thread. override_channel_claim takes a thread someone else has claimed.
  • line_types is Wireless, Wireline, VoIP, TollFree, or Unknown, used with a number lookup.
  • nation_builder_list_id pulls that NationBuilder list. number_pool_id picks the messaging pool. Send returns NoMessagingNumberPool when the workspace requires a pool and this is empty.
  • ntrn_link is the tracked link. auto_response_on_yes is the reply when the contact answers yes, up to 800 characters. is_adjusted_time_zone sends on the contact's local time. send_after_import sends when the upload finishes. scheduled_at is a timestamp. The schedule route still requires type SCHEDULED.
curl -X PATCH "https://apiv2.entrancegrp.com/campaigns/:id" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "text_message": "Hi John, this is a sample message.", "media_url": "https://example.com/image.png" }'
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. Send numbers as digits with the country code and no plus, 15555550100. A 10-digit number is stored with a leading 1.

GET /workspaces/:id/campaigns/:campaignId/contacts?lastid=0&limit=20&order=ASC
Get Contacts

Sample response

{
  "code": 200,
  "lastId": 0,
  "totalRecords": 0,
  "records": []
}
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

Sample response

{
  "code": 200,
  "lastId": 2147483647,
  "totalRecords": 0,
  "records": []
}
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

Sample response

{
  "code": 200,
  "totalRecords": 0,
  "records": []
}
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

Sample response

{
  "code": 200,
  "totalRecords": 5,
  "records": [
    {
      "id": 3432477,
      "workspace_id": "335",
      "campaign_id": "1243480",
      "user_id": "398",
      "created_at": "2026-08-11T20:14:53.254Z",
      "updated_at": "2026-08-11T20:14:53.254Z"
    }
  ]
}
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

Sample response

{
  "code": 200,
  "record": {
    "campaign_id": 1233189,
    "type": "SINGLE_BLAST",
    "uploadContactsResult": {
      "total_added_to_campaign": 1999,
      "total_filtered_from_upload": 1,
      "contact_records_added": 1982,
      "contact_records_updated": 17,
      "filtered_by_master": 0,
      "filtered_by_stop": 0,
      "filtered_by_invalid_number": 1,
      "filtered_by_already_added": 0,
      "filtered_by_error": 0
    },
    "processBeforeSendResults": null,
    "sentToCarrierResults": {
      "delivered": 0,
      "total_undelivered": 0,
      "undelivered": 0,
      "invalid_numbers": 0,
      "queued": 0,
      "stop": 0,
      "spam": 0,
      "rejected": 0,
      "failed": 0
    }
  }
}
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/campaigns/:campaignId/analytics-summary" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/campaigns/:id/upload-progress
getUploadProgress

Sample response

{
  "code": 200,
  "record": {
    "id": 1052769,
    "workspace_id": "335",
    "campaign_id": "1233189",
    "type": "SINGLE_BLAST",
    "current_row": 2000,
    "total_contacts": 2000,
    "added_contacts": 1982,
    "updated_contacts": 17,
    "filtered_by_stop": 0,
    "filtered_by_master": 0,
    "filtered_by_invalid_number": 1,
    "filtered_by_invalid_contact": 0,
    "filtered_by_already_added": 0,
    "filtered_by_contact_error": 0,
    "completion_time": "3390",
    "error": null,
    "error_message": null,
    "filtered_by_channel": 0,
    "original_file_name": "SHIA.07.06.26 - PHONE 1 - Split Workbook - Part 8 (1).csv"
  }
}
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/campaigns/:id/upload-progress" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/campaigns/:id/send-progress
getSendProgress

Sample response

Send has not started for this campaign, so the progress row is missing.

{
  "code": 404,
  "status": 404,
  "errorCode": "SendProgressNotFound",
  "errors": [
    "No send progress found for this campaign."
  ]
}
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/campaigns/:id/send-progress" \ -H "EGKS*********: uvY4tvyE*************"
GET /campaigns/:campaignId/clicks
Get Campaign Clicks

Sample response

{
  "code": 200,
  "lastId": 2147483647,
  "totalRecords": 0,
  "records": []
}
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. Wait until the campaign leaves uploading and its status is ready. Sending while it is still uploading returns 400 CampaignNotReady.

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

Sample response

{
  "code": 200,
  "lastId": 2147483647,
  "totalRecords": 0,
  "records": []
}
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

Sample response

{
  "code": 200,
  "lastId": 2147483647,
  "totalRecords": 0,
  "records": []
}
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

Sample response

{
  "code": 200,
  "last_response": "2024-07-23T00:09:07.643Z",
  "totalRecords": 10,
  "records": [
    {
      "id": 21434399,
      "guid": "redacted",
      "number": "15555550100",
      "workspacenumber": "15555550100",
      "campaign_id": "576707",
      "campaigns": {
        "357437": true,
        "363175": true,
        "365441": true,
        "422425": true,
        "576707": true
      },
      "last_response": "2025-04-17T22:34:38.366Z",
      "last_message": "Hi John, this is a sample message.",
      "stop_filter": false,
      "archived": false,
      "stop": false,
      "meta": {
        "name": "sample"
      }
    }
  ]
}
curl -X GET "https://apiv2.entrancegrp.com/channels?claimed=false" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/channels?claimed=true
Get Channels

Sample response

{
  "code": 200,
  "last_response": "2024-12-03T20:01:53.353Z",
  "totalChannels": "193",
  "unreads": "267",
  "totalRecords": 10,
  "records": [
    {
      "id": 19332577,
      "guid": "redacted",
      "assigned_to": "398",
      "flag_id": null,
      "campaign_id": "487934",
      "number": "15555550100",
      "pp_number": "15555550100",
      "bookmarked": true,
      "archived": false,
      "replied": false,
      "last_response": "2025-04-17T21:17:18.466Z",
      "last_message": "Hi John, this is a sample message.",
      "campaigns": {
        "320528": true,
        "331866": true,
        "430682": true,
        "430690": true,
        "447287": true,
        "466123": true,
        "487934": true
      },
      "stop_filter": false,
      "stop": false,
      "unread": "0",
      "flags": [
        {
          "id": 1786920,
          "flag_id": 21016
        }
      ],
      "total_count": "193",
      "unread_count": "267"
    }
  ]
}
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/channels?claimed=true" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/channels/:id
Get Channel

Sample response

{
  "code": 200,
  "record": {
    "id": 21434399,
    "workspace_id": "335",
    "campaign_id": "576707",
    "guid": "redacted",
    "flag_id": null,
    "assigned_to": null,
    "number": "15555550100",
    "pp_number": "15555550100",
    "bookmarked": false,
    "archived": false,
    "unread": 0,
    "deleted": false,
    "stop_filter": false,
    "last_response": "2025-04-17T22:34:38.366Z",
    "last_message": "Hi John, this is a sample message.",
    "replied": true,
    "campaigns": {
      "357437": true,
      "363175": true,
      "365441": true,
      "422425": true,
      "576707": true
    },
    "restrict": null,
    "locked": false,
    "locked_date": null,
    "archived_date": null,
    "created_at": "2025-04-17T22:34:38.366Z",
    "updated_at": "2025-04-17T22:34:38.366Z",
    "claimed_date": null,
    "workspace_number_is_active": null,
    "contact": {
      "id": 22974616,
      "workspace_id": "335",
      "guid": "redacted",
      "number": "15555550100",
      "number2": null,
      "stop": false,
      "meta": {
        "name": "sample"
      },
      "notes": null,
      "created_at": "2022-06-28T06:05:43.260Z",
      "updated_at": "2025-04-17T22:34:38.505Z",
      "added_by_campaign_id": null,
      "added_by_lookup_id": null,
      "line_type": "Wireless",
      "routable": true,
      "nation_builder_person_id": null,
      "added_by_contact_list_id": null,
      "account_guid": null,
      "account_id": null,
      "sent_opt_out": false,
      "last_routable_at": null
    }
  }
}
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

Sample response

{
  "code": 200,
  "record": [
    {
      "meta": {
        "name": "sample"
      }
    }
  ]
}
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

Sample response

{
  "code": 200,
  "last_ts": null,
  "lastId": 2147483647,
  "totalRecords": 0,
  "records": []
}
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

Sample response

{
  "code": 200,
  "totalRecords": 0,
  "records": []
}
curl -X GET "https://apiv2.entrancegrp.com/incoming-message-keywords" \ -H "EGKS*********: uvY4tvyE*************"
GET /message-filters?unsubscribe=true
Get Filter

Sample response

{
  "code": 200,
  "totalRecords": 1,
  "records": [
    {
      "id": 1254,
      "workspace_id": "335",
      "phrase": "Hi John, this is a sample message.",
      "contains": false,
      "unsubscribe": true
    }
  ]
}
curl -X GET "https://apiv2.entrancegrp.com/message-filters?unsubscribe=true" \ -H "EGKS*********: uvY4tvyE*************"
GET /message-templates?limit=1
Get Message Templates

Sample response

{
  "code": 200,
  "lastId": 22856,
  "totalRecords": 1,
  "records": [
    {
      "id": 22856,
      "workspace_id": "335",
      "user_id": "398",
      "name": "Application",
      "text": "Hi John, this is a sample message.",
      "created_at": "2025-12-01T19:07:35.052Z",
      "updated_at": "2025-12-01T19:07:35.052Z"
    }
  ]
}
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

Use the id from Get Contacts, or the phone number 15555550100. A phone match wins. If that phone is not in the workspace, the same value is tried as the contact id. ?by=id forces the id. ?by=phone forces the phone number.

Sample response

{
  "code": 200,
  "record": {
    "id": 1504669946,
    "workspace_id": "335",
    "guid": "redacted",
    "number": "15555550100",
    "number2": null,
    "stop": false,
    "meta": {
      "last": "Doe",
      "email": "[email protected]",
      "first": "John",
      "business": "Acme",
      "line_type": "mobile"
    },
    "notes": null,
    "created_at": "2026-08-04T14:54:52.332Z",
    "updated_at": "2026-08-04T14:54:52.332Z",
    "added_by_campaign_id": "1233189",
    "added_by_lookup_id": null,
    "line_type": null,
    "routable": true,
    "nation_builder_person_id": null,
    "added_by_contact_list_id": null,
    "account_guid": "redacted",
    "account_id": "845",
    "sent_opt_out": false,
    "last_routable_at": null
  }
}
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/contacts/:contactId" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/contacts?limit=300&order=ASC
Get Contacts

Sample response

{
  "code": 200,
  "lastId": 1504669925,
  "totalRecords": 20,
  "records": [
    {
      "id": 1504669946,
      "number": "15555550100",
      "meta": {
        "last": "Doe",
        "email": "[email protected]",
        "first": "John",
        "business": "Acme",
        "line_type": "mobile"
      },
      "stop": false,
      "updated_at": "2026-08-04T14:54:52.332Z",
      "channel_id": null,
      "stop_filter": null
    }
  ]
}
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

Sample response

No record of this type is in the workspace, so a missing id returns this.

{
  "code": 404,
  "errorCode": "ResourceNotFound",
  "errors": [
    "ContactList record was not found"
  ]
}
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

Sample response

No record of this type is in the workspace, so a missing id returns this.

{
  "code": 404,
  "errorCode": "ResourceNotFound",
  "errors": [
    "ContactList record was not found"
  ]
}
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

Sample response

No record of this type is in the workspace, so a missing id returns this.

{
  "code": 404,
  "errorCode": "ResourceNotFound",
  "errors": [
    "ContactList record was not found"
  ]
}
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

Sample response

No record of this type is in the workspace, so a missing id returns this.

{
  "code": 404,
  "errorCode": "ResourceNotFound",
  "errors": [
    "ContactListImport record was not found"
  ]
}
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

Sample response

{
  "code": 200,
  "lastId": 2147483647,
  "totalRecords": 0,
  "records": []
}
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

Sample response

{
  "code": 200,
  "lastId": 21015,
  "totalRecords": 4,
  "records": [
    {
      "id": 21315,
      "workspace_id": "335",
      "name": "Meeting Request",
      "color_id": "#FFC300",
      "ai_flag": true
    }
  ]
}
curl -X GET "https://apiv2.entrancegrp.com/flags?lastid=9999999999&order=DESC" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:id/flags/:flagId
Get Flag By Id

Sample response

{
  "code": 200,
  "record": {
    "id": 21315,
    "workspace_id": "335",
    "name": "Meeting Request",
    "color_id": "#FFC300",
    "ai_flag": true
  }
}
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

Sample response

No record of this type is in the workspace, so a missing id returns this.

{
  "code": 404,
  "errorCode": "ResourceNotFound",
  "errors": [
    "WorkspaceBlockedNumber record was not found"
  ]
}
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

Sample response

{
  "code": 200,
  "lastId": 0,
  "totalRecords": 0,
  "records": []
}
curl -X GET "https://apiv2.entrancegrp.com/workspace-blocked-numbers?lastid=0&limit=20&order=ASC" \ -H "EGKS*********: uvY4tvyE*************"
GET /shortlists
Get Shortlist Contacts

Sample response

{
  "code": 200,
  "totalRecords": 1,
  "records": [
    {
      "id": "30623",
      "workspace_id": "335",
      "user_id": "398",
      "contact_id": "275993236",
      "contact_guid": "335-15555550100",
      "created_at": "2026-08-03T19:09:33.371Z",
      "updated_at": "2025-01-01T18:45:28.568Z"
    }
  ]
}
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

Sample response

{
  "code": 200,
  "lastId": "335",
  "totalRecords": 2,
  "records": [
    {
      "id": "2255",
      "account_id": "845",
      "organization_name": "Acme",
      "logo": null,
      "type": "credit",
      "active": true,
      "status": "complete",
      "country_code": "US",
      "tendlc_registered": false,
      "created_at": "2025-02-14T15:59:28.248Z"
    }
  ]
}
curl -X GET "https://apiv2.entrancegrp.com/workspaces" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId
Get Workspace

Sample response

{
  "code": 200,
  "record": {
    "id": "335",
    "account_id": "845",
    "owner_id": "398",
    "assigned_id": 3715,
    "organization_name": "Acme",
    "logo": null,
    "type": "credit",
    "active": true,
    "status": "complete",
    "able_to_send": false,
    "country_code": "US",
    "tendlc_registered": false,
    "created_at": "2022-02-01T21:41:45.186Z",
    "updated_at": "2022-06-28T02:34:29.394Z"
  }
}
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

Sample response

{
  "code": 200,
  "record": {
    "permission": "admin"
  }
}
curl -X GET "https://apiv2.entrancegrp.com/workspaces/:workspaceId/permission" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/settings
Get All Settings

Sample response

{
  "code": 200,
  "record": {
    "id": "1000",
    "workspace_id": "335",
    "disable_claims": true,
    "segment_limit": 8,
    "manual_numbers_limit": 2000,
    "cooldown_enabled": true,
    "channel_locking": true,
    "hide_contacts": true,
    "message_webhook": "https://example.com/hook",
    "allow_messaging_number_pools": false,
    "require_opt_out": false
  }
}
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

Sample response

{
  "code": 200,
  "newMessagesToday": 0,
  "messagesYesterday": 0,
  "messageChangePercent": 0,
  "newChannelsToday": 0,
  "channelsYesterday": 0,
  "channelChangePercent": 0,
  "callsToday": 0,
  "callsYesterday": 0,
  "callChangePercent": 0
}
curl -X GET "https://apiv2.entrancegrp.com/analytics/daily-stats" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/daily-analytics
Daily Analytics

Sample response

{
  "code": 200,
  "totalRecords": 7,
  "records": [
    {
      "workspace_id": 335,
      "guid": "redacted",
      "date": "2026-10-01",
      "delivered": 0,
      "response": 0,
      "undelivered": 0,
      "stop": 0,
      "spam": 0
    }
  ]
}
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

Sample response

{
  "code": 200,
  "lastId": 0,
  "totalRecords": 0,
  "records": []
}
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

Sample response

{
  "code": 200,
  "totalRecords": 5,
  "records": [
    {
      "id": 400,
      "workspace_id": "335",
      "email": "[email protected]",
      "firstname": "Harry",
      "lastname": "Rosenblum",
      "number": null,
      "verified_number": null,
      "claim_limit": 20,
      "claim_time": 10,
      "manual_blast_message_limit": 0,
      "disable_manual_blasts": false,
      "manual_blast_approval_required": false,
      "personal_campaigns": true,
      "segment_budget_type": "daily",
      "segment_budget": 0,
      "senior_personal_blasts_only": false,
      "exclude_from_campaigns": false,
      "workspace_user_assign_id": 1806,
      "permission": "user",
      "created_at": "2025-01-23T12:08:53.224Z"
    }
  ]
}
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

11 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

Sample response

{
  "code": 200,
  "totalRecords": 2,
  "records": [
    {
      "id": 28,
      "name": "Webhook-335",
      "url": "https://example.com/hook",
      "created_at": "2025-02-19T11:51:47.479Z",
      "subscriptions": [
        "newMessage"
      ]
    }
  ]
}
curl -X GET "https://apiv2.entrancegrp.com/webhooks" \ -H "EGKS*********: uvY4tvyE*************"
GET /webhooks/events
Get Events

Sample response

{
  "code": 200,
  "totalRecords": 9,
  "records": [
    {
      "event": "Channel Message Status",
      "subscription_name": "channelMessageStatus",
      "category": "Messages"
    }
  ]
}
curl -X GET "https://apiv2.entrancegrp.com/webhooks/events" \ -H "EGKS*********: uvY4tvyE*************"
GET /workspaces/:workspaceId/webhooks/:webhookId
Get Webhook

Sample response

{
  "code": 200,
  "record": {
    "id": 28,
    "workspace_id": "335",
    "name": "Webhook-335",
    "url": "https://example.com/hook",
    "created_at": "2025-02-19T11:51:47.479Z",
    "updated_at": "2025-02-19T11:51:47.479Z",
    "subscriptions": [
      "newMessage"
    ]
  }
}
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

Sample response

{
  "code": 200,
  "totalCount": [
    {
      "count": "1"
    }
  ],
  "lastId": "13289",
  "totalRecords": 1,
  "records": [
    {
      "id": "13289",
      "workspace_id": "335",
      "name": "Emergency Test 2",
      "archive": false,
      "created_at": "2024-08-29T19:01:26.158Z",
      "user_id": 398,
      "private": false,
      "is_influencer_list": true,
      "influencer_number_id": null,
      "influencer_opt_in_message": "Hi John, this is a sample message.",
      "influencer_subscribe_keywords": {
        "Elements": true,
        "subscribe": true
      },
      "nation_builder_list_id": null,
      "is_emergency_list": true,
      "emergency_number_id": "4237",
      "notify_on_add": false,
      "notify_message": null,
      "full_name": "David Barnathan",
      "subscriber_count": "2"
    }
  ]
}
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

25 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

Sample response

{
  "code": 200,
  "record": {
    "id": 86,
    "workspace_id": "335",
    "name": "Test",
    "created_at": "2023-03-24T14:27:59.684Z",
    "updated_at": "2023-03-24T14:27:59.684Z"
  }
}
curl -X GET "https://apiv2.entrancegrp.com/user-groups/:userGroupId" \ -H "EGKS*********: uvY4tvyE*************"
GET /user-groups/:userGroupId/users
Get Users in Group

Sample response

{
  "code": 200,
  "totalRecords": 1,
  "records": [
    {
      "id": 161,
      "workspace_id": "335",
      "user_group_id": "86",
      "user_id": "398",
      "created_at": "2023-03-24T14:28:03.945Z",
      "updated_at": "2023-03-24T14:28:03.945Z",
      "name": "David Barnathan"
    }
  ]
}
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

Sample response

{
  "code": 200,
  "lastId": 82,
  "totalRecords": 3,
  "records": [
    {
      "id": 86,
      "workspace_id": "335",
      "name": "Test",
      "created_at": "2023-03-24T14:27:59.684Z",
      "updated_at": "2023-03-24T14:27:59.684Z"
    }
  ]
}
curl -X GET "https://apiv2.entrancegrp.com/user-groups?lastid=9999999999&limit=20&order=DESC" \ -H "EGKS*********: uvY4tvyE*************"
GET /users/:id
Get User

Sample response

{
  "code": 200,
  "record": {
    "id": 400,
    "workspace_id": "335",
    "email": "[email protected]",
    "firstname": "Harry",
    "lastname": "Rosenblum",
    "number": null,
    "permission": "user",
    "claim_limit": 20,
    "claim_time": 10,
    "manual_blast_message_limit": 0,
    "disable_manual_blasts": false,
    "manual_blast_approval_required": false,
    "personal_campaigns": true,
    "deleted": false,
    "segment_budget_type": "daily",
    "segment_budget": 0,
    "created_at": "2022-02-07T21:43:53.678Z",
    "updated_at": "2022-06-28T02:36:30.881Z",
    "number_verified": false,
    "two_factor_authentication": false,
    "freshdesk_id": null,
    "verified_number": null,
    "add_email_meta": false,
    "replace_email_meta": false,
    "call_forwarding_auto_response": false,
    "call_forwarding_auto_response_message": "Hi John, this is a sample message.",
    "senior_personal_blasts_only": false,
    "integrations": {},
    "two_factor_phone_authentication": false,
    "exclude_from_campaigns": false,
    "push_notifications": false,
    "use_old_flag_system": false,
    "view_only_personal_blasts": false,
    "identity_id": "400"
  }
}
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

Sample response

{
  "code": 200,
  "lastId": 398,
  "totalRecords": 5,
  "records": [
    {
      "id": 400,
      "workspace_id": "335",
      "email": "[email protected]",
      "firstname": "Harry",
      "lastname": "Rosenblum",
      "number": null,
      "permission": "user",
      "claim_limit": 20,
      "claim_time": 10,
      "manual_blast_message_limit": 0,
      "disable_manual_blasts": false,
      "manual_blast_approval_required": false,
      "personal_campaigns": true,
      "deleted": false,
      "segment_budget_type": "daily",
      "segment_budget": 0,
      "created_at": "2022-02-07T21:43:53.678Z",
      "updated_at": "2022-06-28T02:36:30.881Z",
      "number_verified": false,
      "two_factor_authentication": false,
      "freshdesk_id": null,
      "verified_number": null,
      "add_email_meta": false,
      "replace_email_meta": false,
      "call_forwarding_auto_response": false,
      "call_forwarding_auto_response_message": "Hi John, this is a sample message.",
      "senior_personal_blasts_only": false,
      "integrations": {},
      "two_factor_phone_authentication": false,
      "exclude_from_campaigns": false,
      "push_notifications": false,
      "use_old_flag_system": false,
      "view_only_personal_blasts": false,
      "identity_id": "400"
    }
  ]
}
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

Sample response

{
  "code": 200,
  "account_type": "credit",
  "segments": "0",
  "monthly_balance": "-612.2560",
  "start_date": "2026-09-01T00:00:00.000Z",
  "end_date": "2026-09-30T00:00:00.000Z",
  "current_balance": -612.256,
  "cost_per_segment": 0.045,
  "cost_per_segment_next_tier": 0.04,
  "next_tier_segments": 499
}
curl -X GET "https://apiv2.entrancegrp.com/billing/usage" \ -H "EGKS*********: uvY4tvyE*************"
GET /user-api-keys/12345
Get User Api Key

Sample response

{
  "code": 200,
  "record": {
    "id": 4,
    "workspace_id": "335",
    "user_id": "398",
    "app_key": "redacted",
    "created_at": "2023-02-28T18:30:36.944Z"
  }
}
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

Sample response

{
  "code": 200,
  "totalRecords": 6,
  "records": [
    {
      "id": 4,
      "user_id": 398,
      "workspace_id": "335",
      "fullname": "David Barnathan",
      "app_key": "redacted",
      "created_at": "2023-02-28T18:30:36.944Z"
    }
  ]
}
curl -X GET "https://apiv2.entrancegrp.com/user-api-keys?last_id=9999999999999&limit=20&order=DESC" \ -H "EGKS*********: uvY4tvyE*************"
POST /user-api-keys
Create User Api Key
curl -X POST "https://apiv2.entrancegrp.com/user-api-keys" \ -H "EGKS*********: uvY4tvyE*************" \ -H "Content-Type: application/json" \ -d '{ "user_id": 1 }'

Phone numbers

Number pools group the numbers Entrance already assigned to the workspace.

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

Sample response

No record of this type is in the workspace, so a missing id returns this.

{
  "code": 404,
  "errorCode": "ResourceNotFound",
  "errors": [
    "Powerpack record was not found"
  ]
}
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. HTTP Basic with that same pair also works. 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. HTTP Basic with that same pair also works. Authorization: Bearer is a login session, not an API key.

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.