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.
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 endpointsStart 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.
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
}
]
}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
}
]
}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": []
}
}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.
typeisSINGLE_BLAST,PERSONAL,RETARGET,BURST,SCHEDULED,SUBSCRIBER,MANUAL, orHOOK. All caps.numbersis required forMANUAL. Digits only, country code first, no plus:15555550100. A 10-digit number is stored with a leading 1.
Optional fields
manual_user_idassigns the manual campaign. It defaults to the caller. A user permission can only createMANUAL.personal_idis the user for aPERSONALcampaign. It defaults to the caller. That user has to be allowed to send personal campaigns.retarget_campaign_idcopies a campaign that has already been sent and forces typeRETARGET.subscriber_list_idsends to one subscriber list.is_all_subscriber_listssends to every list in the workspace. Do not send both.number_lookup_idlimits the audience to wireless numbers.flag_idstores a flag on the campaign.ntrn_linkis a tracked link, max 512 characters.shortlinkis the same field.media_urlis downloaded and the send goes out as MMS.send_after_importstarts the send when the contact upload finishes.MANUALalways turns this on.override_channel_claimtakes a thread another user has claimed. Default is false.permissionsfalse, orremove_all_permissionsfalse, skips adding workspace users to the campaign.include_excluded_usersadds users who are otherwise left off that list.
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
nameandtext_message(1 to 1600 characters). If the campaign is already sending or sent, a newtext_messageclears the prepared contacts and resets spam and carrier progress. A campaign with sender ids must keep{{sender_id}}in the text.media_urlis a file URL, or null. The file is stored and the send is MMS.force_mmssends as MMS even without a new file.archiveanddeletemark the campaign.filter_against_masterskips people this workspace has already messaged.filter_against_channelsskips numbers that already have a channel.add_stop_messageappends "Reply STOP to Opt-Out" at send time. A workspace that requires opt-out will not let you turn this off.forward_numberis where calls on replies go, 10 digits.disable_claimsstops the campaign from claiming the thread.override_channel_claimtakes a thread someone else has claimed.line_typesisWireless,Wireline,VoIP,TollFree, orUnknown, used with a number lookup.nation_builder_list_idpulls that NationBuilder list.number_pool_idpicks the messaging pool. Send returns NoMessagingNumberPool when the workspace requires a pool and this is empty.ntrn_linkis the tracked link.auto_response_on_yesis the reply when the contact answers yes, up to 800 characters.is_adjusted_time_zonesends on the contact's local time.send_after_importsends when the upload finishes.scheduled_atis a timestamp. The schedule route still requires typeSCHEDULED.
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.
Sample response
{
"code": 200,
"lastId": 0,
"totalRecords": 0,
"records": []
}Sample response
{
"code": 200,
"lastId": 2147483647,
"totalRecords": 0,
"records": []
}Sample response
{
"code": 200,
"totalRecords": 0,
"records": []
}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.
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"
}
]
}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.
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
}
}
}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"
}
}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."
]
}Sample response
{
"code": 200,
"lastId": 2147483647,
"totalRecords": 0,
"records": []
}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.
This GET performs the action. It does not return status.
This GET performs the action. It does not return status.
This GET performs the action. It does not return status.
Templates and text filters
Saved campaign copy and the text filters applied while uploading contacts.
Sample response
{
"code": 200,
"lastId": 2147483647,
"totalRecords": 0,
"records": []
}Sample response
{
"code": 200,
"lastId": 2147483647,
"totalRecords": 0,
"records": []
}Messaging
26 endpointsThe 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.
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"
}
}
]
}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"
}
]
}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
}
}
}This GET performs the action. It does not return status.
Sample response
{
"code": 200,
"record": [
{
"meta": {
"name": "sample"
}
}
]
}Messages
History for one thread is GET /workspaces/:workspaceId/messages with channelid set to that channel. POST on the same path sends a reply.
Sample response
{
"code": 200,
"last_ts": null,
"lastId": 2147483647,
"totalRecords": 0,
"records": []
}Keywords, stops, and templates
Words that trigger an action, unsubscribe filters, and reusable reply text.
Sample response
{
"code": 200,
"totalRecords": 0,
"records": []
}Sample response
{
"code": 200,
"totalRecords": 1,
"records": [
{
"id": 1254,
"workspace_id": "335",
"phrase": "Hi John, this is a sample message.",
"contains": false,
"unsubscribe": true
}
]
}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"
}
]
}Contacts
25 endpointsPeople, 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.
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
}
}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
}
]
}Contact lists
A list is a saved audience you can attach to a campaign. A missing list id returns 404.
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"
]
}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"
]
}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"
]
}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"
]
}Sample response
{
"code": 200,
"lastId": 2147483647,
"totalRecords": 0,
"records": []
}Flags, blocks, and shortlists
Flags label threads. Blocked numbers are never messaged. Shortlists are the small working set for a user.
Sample response
{
"code": 200,
"lastId": 21015,
"totalRecords": 4,
"records": [
{
"id": 21315,
"workspace_id": "335",
"name": "Meeting Request",
"color_id": "#FFC300",
"ai_flag": true
}
]
}Sample response
{
"code": 200,
"record": {
"id": 21315,
"workspace_id": "335",
"name": "Meeting Request",
"color_id": "#FFC300",
"ai_flag": true
}
}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"
]
}Sample response
{
"code": 200,
"lastId": 0,
"totalRecords": 0,
"records": []
}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"
}
]
}Workspaces
13 endpointsWhich 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.
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"
}
]
}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"
}
}Sample response
{
"code": 200,
"record": {
"permission": "admin"
}
}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
}
}Sample response
{
"code": 200,
"newMessagesToday": 0,
"messagesYesterday": 0,
"messageChangePercent": 0,
"newChannelsToday": 0,
"channelsYesterday": 0,
"channelChangePercent": 0,
"callsToday": 0,
"callsYesterday": 0,
"callChangePercent": 0
}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
}
]
}Sample response
{
"code": 200,
"lastId": 0,
"totalRecords": 0,
"records": []
}Who has access
Assign a user to this workspace, or list who is already assigned.
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"
}
]
}Automation
11 endpointsWebhooks 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.
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"
]
}
]
}Sample response
{
"code": 200,
"totalRecords": 9,
"records": [
{
"event": "Channel Message Status",
"subscription_name": "channelMessageStatus",
"category": "Messages"
}
]
}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"
]
}
}Subscriber lists
List, create, and update opt-in lists. Fetching one list by id currently returns 500, so use the collection.
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"
}
]
}Account
25 endpointsUsers, 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.
This GET ends the session.
Users and groups
People who can log into the workspace, and the groups used by campaign permissions.
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"
}
}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"
}
]
}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"
}
]
}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"
}
}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"
}
]
}API keys and billing
Keys for other users, and usage for this workspace.
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
}Sample response
{
"code": 200,
"record": {
"id": 4,
"workspace_id": "335",
"user_id": "398",
"app_key": "redacted",
"created_at": "2023-02-28T18:30:36.944Z"
}
}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"
}
]
}Phone numbers
Number pools group the numbers Entrance already assigned to the workspace.
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"
]
}Node.js Module Usage
Installation
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.
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.
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.