API Documentation for Partners to automate billing workflows with Comms Channel
Overview
The CommsCDR API lets partners programmatically access their call detail records (CDRs) and billing information for mobile and internet services provisioned through Comms Channel — so you can automate billing workflows, reconciliation, auditing, and usage reporting without logging into the portal. This guide covers the three available APIs.
| API | Endpoint | Description |
|---|---|---|
| Authentication | POST /Auth/GetAccessToken | Obtain a Bearer token to authenticate all API requests |
| Usage Records | GET /Cdr/GetUsageRecords | Retrieve filtered call detail records (CDRs) for mobile services |
| Billing Records | GET /Cdr/GetBillingRecords | Retrieve all active internet and voice services being billed |
Base URL
https://commsportal.com.au/apiNote: All API endpoints require authentication. Call the Authentication API first to obtain an access token, then include it as a Bearer token in the Authorization header of every subsequent request.
1. Authentication API
The Authentication API issues a time-limited JSON Web Token (JWT) that must be included in all subsequent API calls. Tokens expire after 1 hour; use the refresh token to obtain a new access token without re-entering credentials.
Endpoint
POST https://commsportal.com.au/api/Auth/GetAccessTokenRequest Headers
| Header | Value | Description |
|---|---|---|
| Content-Type | application/json | Request body must be JSON |
Request Body
| Field | Required | Type | Description |
|---|---|---|---|
| Required | string | Your CommsPortal account email address | |
| password | Required | string | Your CommsPortal account password |
Sample Request
curl --location 'https://commsportal.com.au/api/Auth/GetAccessToken' \
--header 'Content-Type: application/json' \
--data '{
"email": "your@email.com",
"password": "yourpassword"
}'Response Fields
| Field | Type | Description |
|---|---|---|
| tokenType | string | Always "Bearer". Prefix this value to the access token when setting the Authorization header. |
| accessToken | string | The JWT access token. Include this in the Authorization header of all API requests as: Bearer <accessToken> |
| refreshToken | string | A long-lived token used to obtain a new access token once the current one expires, without requiring re-authentication. |
| expiresIn | number | Time in seconds until the access token expires. The standard value is 3600 (1 hour). |
Sample Response
{
"tokenType": "Bearer",
"accessToken": "eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9...",
"expiresIn": 3600.0
}Using the Token
Include the access token in the Authorization header of every subsequent API request:
Authorization: Bearer <accessToken>Important: Access tokens expire after 1 hour (3600 seconds). Store the refreshToken securely and use it to request a new access token when needed. Do not hard-code tokens in your application.
2. Usage Records API (CDRs)
The Usage Records API returns individual call detail records (CDRs) for mobile services. Records can be filtered by date range, phone number, and customer name, and are returned in paginated form.
Endpoint
GET https://commsportal.com.au/api/Cdr/GetUsageRecordsRequest Headers
| Header | Value | Description |
|---|---|---|
| Authorization | Bearer <accessToken> | JWT access token obtained from the Authentication API |
| accept | */* | Standard accept header |
Query Parameters
Append these parameters to the URL as a query string (e.g. ?fromDate=...&toDate=...).
| Parameter | Required | Type | Description |
|---|---|---|---|
| fromDate | Required | string | Start of the date range (inclusive). Format: D Month, YYYY — e.g. 1 January, 2026. Records with a call start time on or after this date will be returned. |
| toDate | Required | string | End of the date range (inclusive). Format: D Month, YYYY — e.g. 15 April, 2026. Records with a call start time on or before this date will be returned. |
| page | Optional | integer | Page number for paginated results. Starts at 1. Defaults to 1 if omitted. |
| pageSize | Optional | integer | Number of records to return per page. Defaults to 20 if omitted. Recommended maximum is 100 per page to ensure fast response times. |
| origin | Optional | string | Filter by the originating phone number (the number that placed the call). Use the full number including country or area code, e.g. 0491643501. |
| destination | Optional | string | Filter by the destination number dialled. Can be a full number or a partial prefix. |
| customerName | Optional | string | Filter records by customer or end-client name. Partial matches may be supported. |
Note: The fromDate and toDate parameters are required. All other parameters are optional filters. Combine multiple optional filters to narrow results — for example, specifying both origin and customerName returns only records matching both criteria.
Date Format
Dates must be provided in the following human-readable format:
D Month, YYYY
Examples:
1 January, 2026
15 April, 2026
3 December, 2025Important: When including dates in a URL, spaces and commas must be percent-encoded. A space becomes %20 and a comma becomes %2C. Most HTTP client libraries handle this automatically. Example: 1%20January%2C%202026
Sample Request
curl --location 'https://commsportal.com.au/api/Cdr/GetUsageRecords
?fromDate=1%20January%2C%202026
&toDate=15%20April%2C%202026
&page=1
&pageSize=5
&origin=0491643501
&destination=0101
&customerName=Company1' \
--header 'accept: */*' \
--header 'Authorization: Bearer <accessToken>'Response Fields
| Field | Type | Description |
|---|---|---|
| totalRecords | integer | Total number of CDR records matching the query filters across all pages. |
| cdrs | array | Array of individual CDR records matching the filters. See CDR Record Fields below. |
CDR Record Fields
| Field | Type | Description |
|---|---|---|
| recordType | string | Record type identifier. "A" indicates a standard call record. |
| custno | integer | Internal customer account number associated with the service. |
| lineseqno | integer | Line sequence number identifying the specific service line within the account. |
| phoneNumber | string | The mobile number associated with the service that generated this record. |
| batchno | integer | Batch number grouping CDRs processed together in the billing cycle. |
| callno | integer | Unique identifier for this individual call record. |
| chargeType | string | Type of charge for this record. Common values: CALL (voice call), SMS (text message), DATA (data usage). |
| dateStart | string (ISO 8601) | Date and time when the call or event started, in ISO 8601 format. Example: 2026-02-05T15:01:23. |
| duration | integer | Duration of the call in seconds. For SMS or data records this may be 0. |
| origin | string | The phone number that originated the call or event. |
| destination | string | The phone number or code that was dialled. |
| serviceid | string | Carrier service identifier code (e.g. WM for Wholesale Mobile). |
| priceComp1 | number | Component 1 of the charge amount (in AUD). May be 0.00 for included calls. |
| priceCharge | number | Total charge applied to this record (in AUD). 0.00 indicates the call was included in the plan. |
| tariffCode | string | Internal tariff code used to rate this record. Example: PM:MVD. |
| extraInfo | string | Additional reference information such as a diversion target number or internal reference. |
| extraInfo2 | string | Secondary supplementary information. Example: "Diverted Call" indicates the call was forwarded. |
Sample Response
{
"totalRecords": 2,
"cdrs": [
{
"recordType": "A",
"custno": 1234567,
"lineseqno": 10,
"phoneNumber": "04XXXXXXXX",
"batchno": 3346352,
"callno": 456715424,
"chargeType": "CALL",
"dateStart": "2026-02-05T15:01:23",
"duration": 20,
"origin": "04XXXXXXXX",
"destination": "04XXXXXXXX",
"serviceid": "WM",
"priceComp1": 0.0,
"priceCharge": 0.0,
"tariffCode": "PM:MVD",
"extraInfo": "42510496",
"extraInfo2": "Diverted Call"
}
]
}Pagination
Results are paginated. Use the page and pageSize parameters to navigate large result sets. The totalRecords field tells you the total number of matching records, which you can use to calculate how many pages exist.
Total pages = ceil(totalRecords / pageSize)
Example: totalRecords=250, pageSize=50 => 5 pages
Page 1: records 1-50
Page 2: records 51-100
...3. Billing Records API
The Billing Records API returns all internet and voice services currently provisioned and billed for your account. This is a snapshot of your active service portfolio — useful for reconciliation, auditing, and displaying service summaries to your end clients.
Note: This endpoint returns all billable services for the authenticated account. No filters are supported — the full service list is always returned.
Endpoint
GET https://commsportal.com.au/api/Cdr/GetBillingRecordsRequest Headers
| Header | Value | Description |
|---|---|---|
| Authorization | Bearer <accessToken> | JWT access token obtained from the Authentication API |
| accept | */* | Standard accept header |
Sample Request
curl --location 'https://commsportal.com.au/api/Cdr/GetBillingRecords' \
--header 'accept: */*' \
--header 'Authorization: Bearer <accessToken>'Response Structure
The response is a JSON object with two top-level arrays:
| Field | Type | Description |
|---|---|---|
| InternetServices | array | List of all internet service records currently active, hidden, or disabled for the account. |
| VoiceServices | array | List of all voice and mobile service records for the account. |
Internet Service Fields
| Field | Type | Description |
|---|---|---|
| id | integer | Unique internal identifier for this service record. |
| type | string | Always "internet" for records in the InternetServices array. |
| description | string | Human-readable service description including plan name, speed, and contract term. Example: "500 Mbps BusinessFibre - 36 Month - Unlimited Internet". |
| status | string | Current service status. Values: active (live and billing), disabled (cancelled/ended), hidden (exists but not shown on the customer portal). |
| unit_price | string | Monthly unit price in AUD, formatted to 4 decimal places. Example: "560.0000" = $560.00/month. |
| quantity | integer | Number of units of this service. Typically 1 for internet services. |
| start_date | string | Date the service commenced, in YYYY-MM-DD format. |
| end_date | string | Date the service ended, in YYYY-MM-DD format. "0000-00-00" means the service has no end date (ongoing). |
| discount | string | Discount flag. "0" means no discount is applied. |
| discount_value | string | The discount amount or percentage applied to this service. |
| discount_type | string | How the discount is applied. Values: percent or fixed. |
| customer_id | integer | Internal identifier for the account/customer this service belongs to. |
| tariff_id | integer | Internal identifier for the rate plan/tariff applied to this service. |
| login | string | Internal login reference associated with this service. |
| additional_attributes.end_client_name | string | The name of the end client or business at the service address. |
| additional_attributes.carrier_service_id | string | The carrier's own reference number for this service (e.g. Telstra or AAPT service ID). |
| additional_attributes.ip_address | string | IP address information assigned to the service, if applicable. |
| additional_attributes.avc_number | string | Access Virtual Circuit number for NBN-based services, if applicable. |
| additional_attributes.po_number | string | Purchase order number provided by the client for this service. |
| geo.address | string | Physical installation address of the service. |
| geo.marker | string | Latitude and longitude coordinates of the service address, formatted as "lat,lng". |
Voice Service Fields
| Field | Type | Description |
|---|---|---|
| id | integer | Unique internal identifier for this voice service record. |
| type | string | Always "voice" for records in the VoiceServices array. |
| description | string | Human-readable service description. Example: "CommsMobile 2.0 - P-5G-XL". |
| status | string | Current service status. Values: active, disabled, or hidden (same definitions as internet services). |
| phone | string | The mobile number(s) associated with this service. Multiple numbers are comma-separated. |
| phonesArray | array | The same phone number(s) as an array of strings, for easier programmatic access. |
| unit_price | string | Monthly unit price per unit in AUD, formatted to 4 decimal places. |
| quantity | integer | Number of units (e.g. number of SIM cards or extensions on this service line). |
| start_date | string | Date the service commenced, in YYYY-MM-DD format. |
| end_date | string | Date the service ended. "0000-00-00" means the service is ongoing. |
| direction | string | Call direction capability. "outgoing" indicates outbound calling is enabled. |
| customer_id | integer | Internal identifier for the account this service belongs to. |
| tariff_id | integer | Internal identifier for the rate plan applied to this service. |
| additional_attributes.end_client_name | string | Name of the end client or business associated with this service. |
| additional_attributes.nickname | string | A friendly label assigned to this service or device. Example: "Samsung A17 Goran". |
| additional_attributes.sip_credentials | string | SIP credentials for VoIP-based services, if applicable. |
| additional_attributes.po_number | string | Purchase order number for this service. |
Sample Response
{
"InternetServices": [
{
"type": "internet",
"id": 1,
"description": "Business Fibre - Fibre 1000 - Unlimited - 48 Months",
"status": "active",
"unit_price": "650.0000",
"start_date": "2026-2-11",
"end_date": "0000-00-00",
"additional_attributes": {
"end_client_name": "Company1",
"carrier_service_id": "12234",
"ip_address": "",
"po_number": ""
},
"geo": {
"address": "15 Street 1",
"marker": "-20.20,120.120"
}
}
],
"VoiceServices": [
{
"type": "voice",
"id": 9988,
"description": "CommsMobile 2.0 - P-4G-S",
"status": "active",
"phone": "04XXXXXXXX",
"phonesArray": ["04XXXXXXXX"],
"unit_price": "26.0000",
"start_date": "2026-03-17",
"end_date": "0000-00-00",
"additional_attributes": {
"end_client_name": "Company1",
"nickname": "User1 iPhone 17"
}
}
]
}Error Handling
The API uses standard HTTP status codes. Below are the most common codes you may encounter:
| Status Code | Meaning | Common Cause |
|---|---|---|
| 200 OK | Success | The request completed successfully and the response body contains the requested data. |
| 400 Bad Request | Invalid request | A required parameter is missing or malformed. Check that fromDate and toDate are present and correctly formatted for the Usage Records API. |
| 401 Unauthorized | Authentication failed | The access token is missing, invalid, or has expired. Re-authenticate using the Authentication API to obtain a fresh token. |
| 403 Forbidden | Access denied | The authenticated account does not have permission to access the requested resource. |
| 404 Not Found | Resource not found | The endpoint URL is incorrect. Verify the request URL against this documentation. |
| 500 Internal Server Error | Server error | An unexpected error occurred on the server. Retry after a short delay. If the issue persists, contact Comms Channel support. |
Support
If you encounter any issues or have questions about the API, contact your Comms Channel account manager or reach out via the CommsPortal support portal at commsportal.com.au.
Important: Always store your API credentials and access tokens securely. Do not share tokens or embed them in client-side code. Refresh tokens programmatically before they expire to ensure uninterrupted access.