Messaging Core eDash API Walkthrough
This document describes the programmatic API available through the Messaging Core eDash platform. All endpoints use your existing dashboard credentials and return JSON.
Base URL: https://tools-be.sharpencx.com
Step 1: Authenticate
Every API session begins by exchanging your dashboard credentials for an access token. This token is required for all subsequent requests.
Request
POST https://tools-be.sharpencx.com/authenticateHeader | Value |
|---|---|
Content-Type | application/json |
Body
{
"email": "your-dashboard-email@example.com",
"pwd": "your-dashboard-password"
}
Response (200 OK)
{
"token": "eyJhbGciOiJIUzI1NiIs...{JWT token}",
"user": {
"id": 54321,
"forename": "Jane",
"surname": "Doe",
"is_admin": 0,
"email": "your-dashboard-email@example.com",
"accountId": 12345,
"roles": []
}
}
Save the token value. You will include it as a Bearer token in every request below.
Step 2: Choose Your Use-Case
Once authenticated, you can call any of the following endpoints. Each request must include your token:
Header | Value |
|---|---|
Authorization | Bearer |
Use-Case A: Message Volume by Day (Daily / Weekly / Monthly Reporting)
Returns aggregate message counts grouped by date. Use this to build volume trend reports.
Request
GET https://tools-be.sharpencx.com/edash-admin/traffic/stats?from_date={start}&to_date={end}&period=DAILY
Header | Value |
|---|---|
Authorization | Bearer {token} |
Parameter | Format | Example | Description |
|---|---|---|---|
from_date | YYYY-M-DD | 2025-3-15 | Start of reporting window |
to_date | YYYY-M-DD | 2026-4-15 | End of reporting window |
period | string | DAILY | Aggregation period: |
Response (200 OK)
{
"stats": {
"2025-03-15": {
"pending": 70,
"failed": 2,
"delivered": 6226,
"total": 6298,
"inbound": 72
},
"2025-03-16": {
"pending": 101,
"failed": 10,
"delivered": 5918,
"total": 6029,
"inbound": 54
}
}
}
Each date entry contains:
Field | Description |
|---|---|
total | Total outbound messages sent that day |
delivered | Messages confirmed delivered to handset |
failed | Messages that failed to deliver |
pending | Messages still awaiting delivery confirmation |
inbound | Inbound (reply) messages received that day |
Notes:
Date ranges up to 13+ months are supported.
One entry is returned per day. For weekly or monthly totals, sum the daily values across the desired date range in your reporting tool.
Use-Case B: Delivery Status per Message (Sent, Delivered, Failed, Opt-Outs)
Returns individual message records with delivery status, segment count, and timestamps. Use this for per-message auditing and delivery analysis.
Request
GET https://tools-be.sharpencx.com/edash-admin/traffic/outbox?limit={n}&offset={n}&includeSubAccounts=true&from_date={start}&to_date={end}
Header | Value |
|---|---|
Authorization | Bearer {token} |
Parameter | Format | Example | Description |
|---|---|---|---|
limit | integer | 100 | Number of messages per page (max 100) |
offset | integer | 0 | Pagination offset (0 for first page) |
includeSubAccounts | boolean | true | Include messages from all sub-accounts |
from_date | YYYY-MM-DD | 2025-03-15 | Start of date range |
to_date | YYYY-MM-DD | 2026-04-15 | End of date range |
Response (200 OK)
{
"count": "84650",
"messages": [
{
"id": "361405608",
"message_id": "US-AWS01-1503406461234",
"account_id": 12345,
"created_ts": "2026-04-15T16:36:55.250Z",
"source_type": "service",
"source_data": "STOP",
"parts": 1,
"destination": "17775551234",
"source": "13175551234",
"content": "(message text)",
"status": 1,
"status_text": "RECEIVED",
"status_string": "DELIVRD_TO_HANDSET",
"status_updated_ts": "2026-04-15T16:36:56.851Z",
"transmit_ts": "2026-04-15T16:36:55.235Z",
"receipt_ts": "2026-04-15T16:36:56.851Z",
"carrier": "smppom",
"send_type": "sms",
"forward_endpoint": null,
"deleted": false,
"deleted_by": null,
"deleted_ts": null,
"deleted_host": null
}
]
}
Key fields:
Field | Description |
|---|---|
count | Total messages matching your filter (note: returned as a string) |
parts | Number of SMS segments this message was split into (1, 2, 3, etc.) |
status | Numeric status: 1 = Delivered, 2 = Failed, 8 = Pending |
status_string | Human-readable status: DELIVRD_TO_HANDSET, UNKNOWN, INVALID_DEST_COUNTRY |
source_type | How the message was sent: "smpp" (API), "https" (HTTP), "service" (system) |
source_data | Identifies the sender: account ID, or "STOP" for system opt-out replies |
created_ts | When the message was submitted |
transmit_ts | When the message was sent to the carrier |
receipt_ts | When the delivery receipt was received from the carrier |
Pagination: To retrieve all messages, increment offset by your limit value until offset >= count. For example, with limit=100:
Page 1:
offset=0(messages 1-100)Page 2:
offset=100(messages 101-200)Page 3:
offset=200(messages 201-300)Continue until offset >= 84650
Identifying opt-outs: Messages where source_type = "service" and source_data = "STOP" are system-generated opt-out confirmation replies. Filter on these two fields to count opt-out events.
Use-Case C: Segment Count per Message
Segment counts are included in every outbox message record (Use-Case B above). The parts field on each message indicates how many SMS segments the message was split into.
Standard SMS segments are 160 characters (GSM-7 encoding) or 70 characters (Unicode). Longer messages are automatically split:
parts | Meaning |
|---|---|
1 | Single-segment message (<=160 chars) |
2 | Two-segment message (161-306 chars) |
3 | Three-segment message (307-459 chars) |
No separate API call is needed. Use the outbox endpoint from Use-Case B and read the parts field from each message.
Use-Case D: Provisioned Phone Numbers
Lists all phone numbers provisioned to your account, including routing configuration and carrier details.
Request
GET https://tools-be.sharpencx.com/edash-admin/numbers
Header | Value |
|---|---|
Authorization | Bearer {token} |
No query parameters required.
Response (200 OK)
{
"numbers": [
{
"id": 5172,
"account_id": 1234,
"account_routing_param": "13175551234",
"carrier": 103,
"active": 1,
"default": 1,
"status": 1,
"added": "2023-11-30T21:56:51.241Z",
"routing_type_id": 1,
"custom_queue": "MOQueue:smppGW:12345",
"account_routing": 1,
"verified": "N/A",
"forward_url": null,
"comment": "",
"originator_id": null,
"openmarket_acc_id": null,
"status_updated_at": null,
"deprovision_date": null,
"provision_date": null
}
]
}
Field | Description |
|---|---|
account_routing_param | The phone number (E.164 format without + prefix) |
carrier | Carrier ID |
active | 1 = active, 0 = inactive |
default | 1 = default sending number for the account |
status | Provisioning status (1 = active) |
Authentication Reference
Item | Detail |
|---|---|
Base URL |
|
Auth method | Email/password POST, returns JWT Bearer token |
Token lifetime | 12 hours (re-authenticate after expiry) |
Token usage | Include as |
Delivery Status Reference
status (numeric) | status_string | Meaning |
|---|---|---|
1 | DELIVRD_TO_HANDSET | Delivered to the recipient's phone |
1 | SENT_TO_OPERATOR | Delivered to the carrier (awaiting handset confirmation) |
2 | UNKNOWN | Failed - unknown reason |
2 | INVALID_DEST_COUNTRY | Failed - destination country not supported |
2 | destination-unsubscribed | Failed - recipient has opted out |
8 | (none) | Pending - awaiting carrier response |
Not Currently Available (Feature Requests)
The following use-cases cannot be fulfilled by the current API. Feature requests are open with our Product and Engineering teams for each:
1. Campaign or Template Name
Message records do not include campaign names, template IDs, or batch identifiers. Each outbound message is stored as a flat record with no linkage back to the campaign or template that originated it. The source-identifying fields are source_type (smpp/https/service) and source_data (account ID or system tag), which identify the sending method but not the business-level campaign.
Current Feature Request: Add campaign_id, template_id, and/or a freeform metadata field to outbound message records at send time, so messages can be grouped and reported by campaign or template.
2. Total Cost (Daily or Monthly)
There is no cost or billing endpoint exposed on the dashboard API. The platform tracks a per-message rate, but this data is not available to API consumers. Calculating cost requires multiplying by the segment count (parts field), which the platform does not pre-compute.
Current Feature Request: Expose a /edash-admin/billing/summary endpoint (or similar) that returns daily/monthly cost totals, factoring in per-segment pricing.
3. Dedicated Opt-Out Reporting
While opt-out events can be identified by filtering outbox records for source_type = "service" and source_data = "STOP", there is no dedicated opt-out count endpoint or opt-out list. Retrieving opt-out data requires paginating through the entire outbox and filtering client-side.
Current Feature Request: Expose a /edash-admin/traffic/optouts endpoint that returns opt-out events with timestamps, phone numbers, and counts, without requiring full outbox pagination.